1

わかりました。3時間ほど格闘した後、これを解決できないため、ここに質問を投稿することにしました。

要点に行きましょう。

PrimeFaces 3 を使用して NetBeans Web プロジェクトを作成しました。正常に動作し、何の問題もありません。

しかし、その Web プロジェクトを Web モジュールとして使用して、エンタープライズ アプリケーションを作成する必要があります。

EJB 部分がほぼ完成した EE プロジェクトがすでにあるので、Web ページを Enterprise プロジェクトの War 部分にコピーし、マネージド Bean を書き直すことによって、2 つのプロジェクトの「マージ」を開始しました。

しかし、物事が面倒だったので、いくつかの変更を加える必要がありました。

異なるバージョンの 2 つのファイルのコードを記述します (このコードは単一の Web プロジェクトで機能することに注意してください!):

-- JSFページ --

[cut]
<p:dialog id="loginDialog" header="Login" widgetVar="loginDialog" showEffect="fade" hideEffect="fade" position="center" draggable="false" resizable="false" height="220" width="300" modal="true" showHeader="false">
        <h:form id="loginForm">
            <br/>
            Username: <br/><p:inputText id="username" value="#{loginBean.username}" required="true" requiredMessage="random error message"/><br/><br/>                           
            Password: <br/><p:password id="password" value="#{loginBean.password}" required="true" requiredMessage="random error message"/><br/><br/>                                                        
            <p:commandButton value="Login" actionListener="#{loginBean.doLogin}" oncomplete="handleLoginRequest(xhr, status, args)" ajax="true" update=":growl, :loginForm, :userPanel"/> <p:commandButton value="Cancel" type="button" onclick="loginDialog.hide()" />
        </h:form><br/>                    
    </p:dialog>
[cut]

-- マネージドビーン --

[cut]
public void doLogin(ActionEvent ae) {
    user = loginUser.doLogin(username, password);
    loggedIn = false;
    FacesMessage msg;
    RequestContext context = RequestContext.getCurrentInstance();
    if (user != null) {
        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome " + user.getUsername(), user.getUsername());
        loggedIn = true;
    } else {           
        msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Login failed", "Incorrect credentials");
    }
    FacesContext.getCurrentInstance().addMessage(null, msg);
    context.addCallbackParam("loggedIn", loggedIn);
}
[cut]

このコードが私の Web プロジェクトで機能する場合でも、それを完全な EE アプリケーションに「移動」すると、エラーが発生します。

クラス「ManagedBeans.LoginBean」にはプロパティ「doLogin」がありません。

したがって、問題が doLogin の署名によって引き起こされていると仮定すると (1 つのパラメーターを使用しますが、JSF ページではそれなしで呼び出されます)、これが PrimeFaces ドキュメントでコンポーネントが使用される方法であるという事実にもかかわらず、私は単純にに変更しました:

-- JSFページ --

[cut]
<p:dialog id="loginDialog" header="Login" widgetVar="loginDialog" showEffect="fade" hideEffect="fade" position="center" draggable="false" resizable="false" height="220" width="300" modal="true" showHeader="false">
        <h:form id="loginForm">
            <br/>
            Username: <br/><p:inputText id="username" value="#{loginBean.username}" required="true" requiredMessage="random error message"/><br/><br/>                           
            Password: <br/><p:password id="password" value="#{loginBean.password}" required="true" requiredMessage="random error message"/><br/><br/>                                                        
            <p:commandButton value="Login" action="#{loginBean.doLogin()}" oncomplete="handleLoginRequest(xhr, status, args)" ajax="true" update=":growl, :loginForm, :userPanel"/> <p:commandButton value="Cancel" type="button" onclick="loginDialog.hide()" />
        </h:form><br/>                    
    </p:dialog>
[cut]

-- マネージドビーン --

[cut]
public void doLogin() {
    user = loginUser.doLogin(username, password);
    loggedIn = false;
    FacesMessage msg;
    RequestContext context = RequestContext.getCurrentInstance();        
[cut]

そのため、メソッド シグネチャと commandButton のアクションを変更しました。

この変更を行うことで、以前のエラーはなくなったようですが..

java.lang.NoClassDefFoundError: org/primefaces/context/RequestContext

はい、今これを手に入れました。

明確にするために、ライブラリはインポートされ、すべて問題ありません。NetBeans は org.primefaces.* から正しくインポートできるので、jar ファイルがロードされたと仮定します。

しかし、ここで奇妙なことが起こります。

ライブラリから PrimeFaces を削除し、新しい jar (以前と同じもので、別のディレクトリにあるだけ) をインポートすると、動作するようです。

ページは問題なく読み込まれます。

しかし、これは次のデプロイまで続きます。新しいデプロイでは以前と同じ NoDefClassFoundError が発生するためです。

ライブラリパスをいじって解決するため、これはかなりランダムなことですが、複数の展開で機能するものはありません。

物事はかなり奇妙であるため、どうすればよいかわかりません。

http://primefaces.org/ui名前空間 (またはこのようなもの)のライブラリが見つからないという黄色の警告が表示されたページが読み込まれることがあります。

質問が長くなって申し訳ありませんが、私が見ているものを説明するのはかなり難しいです。

解決策を教えてくれる人はいますか?

4

1 に答える 1

6

両方の問題の原因はまったく同じです。PrimeFaces JAR ファイルがランタイム クラスパスにありません (簡単にするために、PrimeFaces 3.x を使用していて、taglib URI を変更していないと仮定します)。

クラス「ManagedBeans.LoginBean」にはプロパティ「doLogin」がありません。

最初の例外は確かにやや誤解を招くものですが、実際には PrimeFaces コンポーネントは Facelets によってまったく解決されておらず、プレーンテキスト/html として扱われています。PrimeFacesコンポーネントのマークアップでインライン化された EL 式は、値式として解決されます。ELをテンプレートテキストにプレーンに書いているようなものです<p>#{loginBean.doLogin}</p>getDoLogin()次に、結果を出力するためのメソッドを探しています。

java.lang.NoClassDefFoundError: org/primefaces/context/RequestContext

2 番目の例外は、問題の本当の説明に近づきます。前述のクラスを含む JAR ファイルが Web アプリケーションのランタイム クラスパスにありません。

/WEB-INF/libPrimeFaces JAR ファイルがデプロイの webapp のフォルダーに存在することを確認してください。

于 2012-03-22T21:34:18.020 に答える