1

私がしていることは、フィールドに値を渡さずに送信して、必要なフィールドのエラーメッセージを表示してから、フィールドに値を渡して再度送信することです。Tomcatで動作し、リクエストのGlassfishは送信されません。誰かが何が起こっているのか知っていますか?

何が起こるかの写真

何が起こるかの画像、コンソールjavascriptのエラー

私は本当に何が起こっているのか分かりません、誰か知っていますか?Tomcat7とGlassfish3、Primefaces 3.4.2 e PrimefacesExtensions0.6.2を使用しています。.earエンタープライズプロジェクトで。

:===============:理解を深めるための補足。:===============:

こんにちは皆さん、この問題を解決するのは難しいです。他の場所を検索した後、プロジェクトの依存関係で問題になる可能性があることがわかりました(どこにあるかわかりません)。そこで、primefacesサイトを例にとり、3つの視点で再現することにしました。

  1. Tomcatで実行(動作)
  2. Glassfishで実行(作業済み)
  3. 私のプロジェクトでGlassfishを使用して実行しています(機能していません)

1と2では、次のように、 primefacesサイトの例のctrl + C / ctrl+Vを実行しました。

index.xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="pt-br" 
      xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui">
    <f:view>
        <h:head/>
        <h:body>
            <h:form id="form">  
                <p:panel id="panel" header="New Person">  
                    <p:messages id="msgs"/>  
                    <h:panelGrid columns="3">  
                        <h:outputLabel for="firstname" value="Firstname: *" />  
                        <p:inputText id="firstname" value="#{testMB.name}" required="true" label="Firstname">  
                            <f:validateLength minimum="2" />  
                        </p:inputText>  
                        <p:message for="firstname" display="icon"/>  
                        <h:outputLabel for="surname" value="Surname: *" />  
                        <p:inputText id="surname" value="#{testMB.name}" label="Surname" required="true">  
                            <f:validateLength minimum="2" />  
                            <p:ajax update="msgSurname" event="keyup" />  
                        </p:inputText>  
                        <p:message for="surname" id="msgSurname" display="icon"/>  
                    </h:panelGrid>  
                    <p:commandButton id="btn" value="Save" update="panel" actionListener="#{testMB.save(actionEvent)}"/>  
                </p:panel>  
            </h:form> 
        </h:body>
    </f:view>
</html>

TestManagedBean.java:

@ManagedBean(name="testMB")
@RequestScoped
public class TestManagedBean
{
  private String name;
  private String surname;

  public String getName()
  {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

  public void save(ActionEvent actionEvent) {
    addMessage(FacesMessage.SEVERITY_INFO, "TEST: " + this.name);
  }

  public void addMessage(FacesMessage.Severity s, String summary) {
    FacesMessage message = new FacesMessage(s, summary, null);
    FacesContext.getCurrentInstance().addMessage(null, message);
  }
}

3で同様に行いましたが、計画されたアーキテクチャを使用することで、shiro、facelets、layout primefaces拡張機能などのセキュリティフィルターを使用しています...shiroを確認しましたが、フィルターが何かを妨げていません。他の依存関係も確認されています。私が見つけたのは、ejbモジュールでprimefacesを宣言し(primefacesのSortOrderモデルクラスを使用しているため)、Webモジュールもprimefacesとprimefaces拡張機能を宣言していることです。

プロジェクトの依存関係は問題と関係がありましたか?ejbモジュールでprimefacesの依存関係を削除し、Webモジュールでのみprimefacesを宣言する方が適切でしょうか。(ここで試しましたが、Webモジュールはejbモジュールを認識できますが、その逆は発生しません。どうすればよいですか?)

みんなありがとう、英語でごめんなさい、私はブラジル人です。

4

2 に答える 2

1

EJBはPrimefacesを参照してはならず、可能な限りプラットフォームに依存しないようにする必要があります(ただし、実際には、Hibernate / EclipseLinkに依存しないことは残念ながら非現実的です)

私が使用する構造の種類は次のとおりです。

EAR
  |- (1) WAR
  | \- Primefaces xhtml files etc.
  | |- backing beans (support components in the xhtml files)
  | |- dao beans (handle any interactions with the @Remote facades)
  | |- Dependencies: (2,3)
  |
  |- (2) JAR @Remote interfaces
  | \- Dependencies: (3)
  |
  |- (3) JAR @Entity objects
  | \- Dependencies: (none)
  |
  |- (4) @EJB Module
    \- @Local interfaces
    |- @Local implementations
    |- @Remote implementations
    |- Dependencies: (2,3)

2つの重要な部分は、WARモジュールとEJBモジュールです。これらは両方とも、@Remoteおよび@Entityjarに依存しています。それらは互いに直接依存していません。

ManagedBeanがEJBと通信するときは、リモートインターフェイスを呼び出すことによって通信します。たとえば@EJB RemoteMyBeanInterface myBean、EJBモジュールの実装を実際に返します(魔法によって)。

モジュールを分離してみて、それが役立つかどうかを確認してください。そうでない場合は、セキュリティフィルターによる干渉が発生する可能性があります(おそらくサイレントに)。クリーンな新しいプロジェクトを開始する必要があります(+必要に応じて新しいサーバードメイン)。Primefacesのカットアンドペーストされたコードから始めて、問題の原因にぶつかるまで、すべてのエクストラとフィルターを1つずつ追加し始めます。

それでも困っている場合は、Primefacesフォーラムに投稿するか、BalusCの注目を集めてみてください。彼がここに投稿した回答のおかげで、私の問題のほとんどは解決されました。

于 2013-02-08T13:33:20.880 に答える
0

私も同様の問題を抱えていました。どのように修正したか正確には思い出せませんが、次のように追加することで解決したと確信していますweb.xml

<context-param>
  <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
  <param-value>false</param-value>
</context-param>

および/または

<context-param>
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  <param-value>server</param-value>
</context-param>

首を突き出して、それが最初のコードスニペットであると言いますが、サーバーに設定されている状態保存方法に依存する場合としない場合があります。

于 2013-01-27T16:22:12.570 に答える