2012-01-13 5 views
2

p:selectOneMenu(Primefaces 3.0)のAJAX呼び出し中に、JBoss-7.1.0.CR1bでカスタム@FacesConverterの奇妙な問題が発生しました。@FacesConverterは、p:selectOneMenuとp:ajaxのメソッド呼び出しを防止します

簡略化ConverterはNPEまたは他の例外なしには、コンバータがp:selectOneMenuに使用されている

@FacesConverter("MyConverter") 
public class MyConverter implements Converter 
{  
    public Object getAsObject(FacesContext fc, UIComponent uic, String value) 
    { 
    logger.debug("getAsObject value: "+value); 
    if (submittedValue.trim().equals("")) {return null;} 
    else 
    {   
     MyEjb ejb = new MyEjb(); 
     ejb.setId(Long.parseLong(value())); 
     return ejb; //**** alternative with return null; **** 
    } 
    } 
    public String getAsString(FacesContext fc, UIComponent uic, Object value) 
    { 
    if (value == null || value.equals("")) {return "";} 
    else 
    { 
     MyEjb ejb = (MyEjb)value; 
     return ""+ejb.getId(); 
    } 
    } 
} 

このクラスではありません、次のようになります。

<h:form> 
    <p:selectOneMenu value="#{clientBean.selected}" converter="MyConverter"> 
    <f:selectItems value="#{clientBean.all}" var="my" 
        itemLabel="#{my.name}" itemValue="#{my}"/> 
     <p:ajax listener="#{clientBean.changed}" /> 
    </p:selectOneMenu> 
</h:form> 

ロケット工学ではありません、変更メソッドは単純にデバッグを行います:

public void changed() 
{ 
    logger.info("changed() "+selected); 
} 

しかし、今は迷惑な一部:changed()は、上記のようなコードで呼び出されることはありませんが、私は、コンバータは回呼び出されます:私はlong selectedIdからp:selectOneMenu value="#{clientBean.selectedId}"を変更し、メソッドが呼び出されるコンバータを使用しない場合は

12:37:51,500 DEBUG getAsObject value: 35 
12:37:51,502 DEBUG getAsObject value: 
12:37:51,503 DEBUG getAsObject value: 

を一度。 return nullgetAsObject()であっても、changed()が呼び出されます(1回だけ)。私はh:selectOneMenuf:ajaxを使っても同じ動作をするので、Primefacesに関連するとは思わない。

+0

@Ondra:この問題はJBoss AS 7にどのくらい関係していますか?この方法では、この問題が他のサーバーには現れていないことを暗示しています。これは、この特定の問題では間違っています。 – BalusC

答えて

5

<p:messages />,<p:growl />または<h:messages />があなたのビューでajaxで更新されているはずです。また、失われた顔メッセージに関するサーバーログの警告にも注意する必要があります。あなたが悪名高いValidation error: Value not validの検証エラーを見ている可能性は大きいです。

変換後、JSFは、改ざんされたリクエストまたはハッキングされたリクエストに対する保護の一部として、送信されたオブジェクトが利用可能なアイテムの1つであるかどうかを検証します。 JSFは<f:selectItems>にあるように利用可能なオブジェクトごとにsubmittedObject.equals(oneOfAvailableObjects)でそれを行います。一致しない場合、JSFはこの検証エラーを表示します。

具体的なケースでは、MyEjbクラスは明らかにequals()メソッドを持たないか、その実装が壊れています。 Right way to implement equals contractも参照してください。

+0

私は 'equals'を_technical equality_のためのdescirbeとして実装しました。それは魅力のように機能します。あなたのサポート、BalusCにもう一度感謝します。 – Thor

+0

ようこそ。 – BalusC

関連する問題