0

Java Web は初めてです。私は netbeans 7.0.1 と glassfish 3 を使用して Web アプリケーションを開発しています。すべてのデータ入力がほぼ完了し、レポートとグラフを作成したいと考えています。要件は、動的データ (ユーザーがデータにフィルターを適用できるデータベース/データテーブルから) を使用してグラフ (ユーザーの選択に基づく円/棒/線) を作成することです。私は Primefaces を使用してみましたが、primeface ショーケースで与えられた簡単な例で以下のエラーが発生します:

javax.faces.event.AbortProcessingException: /pages/analyst/analyse.xhtml @65,151 actionListener="#{analysis.bar()}": java.lang.NoClassDefFoundError: org/primefaces/component/chart/series/ChartSeries

viewscope の managedbean に裏打ちされたデータテーブルを保持する jsf ページがあります。以下は私のコードです:

ページ

<html   xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:p="http://primefaces.org/ui" 
        xmlns:f="http://java.sun.com/jsf/core">

    <body>
        <ui:composition template="./../../WEB-INF/Templates/VUTemplate.xhtml">
            <ui:define name="menu">
                <h:form id="home">
                    <p:menu>
                        <p:menuitem value="Home Page" url="../home.xhtml" />
                    </p:menu>
                </h:form>
            </ui:define>
            <ui:define name="content">
                <h:form id="form" prependId="false">
                    <p:growl id="growl" showDetail="true"/>  

                    <p:barChart id="basic" value="#{analysis.categoryModel}" legendPosition="ne"
                                title="Basic Bar Chart" min="0" max="200" style="height:300px"/>

                    <p:dataTable id="table" var="var" widgetVar="wbTable"
                                 value="#{analysis.list}" 
                                 paginator="true" rows="10" 
                                 paginatorPosition="bottom"
                                 emptyMessage="No data found with given criteria"
                                 >                                

                        <f:facet name="header">  
                            World Bank Open Data Analysis
                        </f:facet>  

                        <p:column filterBy="#{var.regionFullName}" sortBy="#{var.regionFullName}"
                                  headerText="Region" footerText="Enter starting characters" >  
                            <h:outputText   value="#{var.regionFullName}" />
                        </p:column>

                        <p:column filterBy="#{var.countryFullName}" sortBy ="#{var.countryFullName}"
                                  headerText="Country" footerText="Enter starting characters" >
                            <h:outputText   value="#{var.countryFullName}" />
                        </p:column>

                        <p:column  filterBy="#{var.indcatorTypeName}" sortBy ="#{var.indcatorTypeName}"
                                   headerText="Indicator Type" footerText="Enter starting characters" >
                            <h:outputText   value="#{var.indcatorTypeName}" />
                        </p:column>

                        <p:column  filterBy="#{var.indicatorName}" sortBy ="#{var.indicatorName}"
                                   headerText="Indicator" footerText="contains" filterMatchMode="contains">
                            <h:outputText   value="#{var.indicatorName}" />
                        </p:column>

                        <p:column  filterBy="#{var.year}" sortBy ="#{var.year}" 
                                   headerText="Year" footerText="starts with">
                            <h:outputText value="#{var.year}" />
                        </p:column>

                        <p:column  filterBy="#{var.dataValue}" sortBy ="#{var.dataValue}"
                                   headerText="Data Value" footerText="starts with" >
                            <h:outputText value="#{var.dataValue}" />
                        </p:column>
                    </p:dataTable>

                    <h:panelGrid id="command" columns="6"  cellpadding="4" >
                        <p:commandButton id="line" value="Line" actionListener="#{analysis.line()}"  process="@this :form:table"  update="result  table" >                                
                        </p:commandButton>
                        <p:commandButton id="bar" value="Bar" actionListener="#{analysis.bar()}" process="@this :form:table"  update="result  table" >                                
                        </p:commandButton>
                    </h:panelGrid>
                    <p:messages id="result" showDetail="true" autoUpdate="true"/>  

                </h:form>
            </ui:define>
        </ui:composition>
    </body>
</html>

バックビーン

import ejb.VwdataFacade;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import model.Vwdata;
import org.primefaces.component.chart.series.ChartSeries;
import org.primefaces.model.chart.CartesianChartModel;

@ManagedBean
@ViewScoped
public class Analysis implements Serializable{
    private List<Vwdata> list;

    private @EJB VwdataFacade wsvc;  //entity services    
    private CartesianChartModel categoryModel;

    public Analysis() {
    }   

    public CartesianChartModel getCategoryModel() {
        return categoryModel;
    }

    @PostConstruct
    public void init() { 
        list = wsvc.findAll();
     }

    public List<Vwdata> getList() {
//        list = wsvc.findAll();
        return list;
    }
    public void line(){

    }

    public void bar(){
        createCategoryModel();
    }

    private void createCategoryModel() { 
        categoryModel = new CartesianChartModel();  
        ChartSeries yaxis = new ChartSeries();
        yaxis.setLabel("Label");          
        yaxis.set("2004",120);
        yaxis.set("2005",130);
        yaxis.set("2006",140);
        yaxis.set("2007",110);
        categoryModel.addSeries(yaxis); 
    }

}

コンストラクターまたは init メソッドに createCategoryModel の呼び出しを配置すると、チャート コードなしでは完全に機能していたページを表示することさえできなくなります。どんな助けでも大歓迎です。ありがとう

4

1 に答える 1

1
java.lang.NoClassDefFoundError: org/primefaces/component/chart/series/ChartSeries

上記のクラスはPrimeFaces3.0で導入されたため、PrimeFaces2.x以前では使用できませんでした。

PrimeFaces 3.0固有のXML名前空間http://primefaces.org/uiとコード内のすべての<p:xxx>タグがFaceletsコンパイルエラーを引き起こさなかったという事実を考えると、これは、WebアプリケーションのランタイムクラスパスにPrimeFaces2.xと3.xの両方のライブラリがあることを意味するだけです。ここで、2.xのものがクラスローディングで優先されました。

Webアプリのランタイムクラスパスから問題のある古いPrimeFaces2.xライブラリを削除すると、この問題は解消されます。

于 2012-06-18T19:08:16.073 に答える