2012-01-13 64 views
2

我在使用JBoss-7.1.0.CR1b在012xx(Primefaces 3.0)中調用AJAX期間自定義@FacesConverter時出現了一個奇怪的問題。@FacesConverter防止方法調用p:selectOneMenu和p:ajax

簡化轉換器看起來是這樣的,沒有NPE或其他異常這一類

@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(); 
    } 
    } 
} 

該轉換器在p:selectOneMenu使用:

<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()不會與類似上面的代碼中調用,但我得到的轉換器調用次:

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

如果我改變p:selectOneMenu value="#{clientBean.selectedId}"long selectedId和不使用轉換器的方法被調用一旦。即使我在getAsObject()return nullchanged()被稱爲(一次)。我不認爲它是Primefaces相關的,因爲如果我使用h:selectOneMenuf:ajax,我具有相同的行爲。

+0

@Ondra:這個問題到底如何與JBoss AS 7相關?這樣你就意味着問題不會在其他服務器上出現,這對於這個特殊問題是不真實的。 – BalusC 2012-02-19 17:14:43

回答

5

你應該有一個<p:messages />,<p:growl /><h:messages />這是在你的看法ajax更新。您還應該注意服務器日誌中有關可能丟失面部信息的警告。機會很大,你會看到臭名昭着的Validation error: Value not valid驗證錯誤。

轉換後,JSF將驗證提交的對象是否是可用項目之一,作爲防範篡改/被黑客請求的一部分。 JSF將通過submittedObject.equals(oneOfAvailableObjects)爲每個可用對象執行此操作,如<f:selectItems>中的那樣。如果沒有匹配,那麼JSF將顯示此驗證錯誤。

在您的具體情況下,MyEjb類顯然沒有equals()方法或其實現被破壞。另見Right way to implement equals contract

+0

我已經實現了'equals',正如你所期望的那樣,技術上的平等,它就像一個魅力。再次感謝您的支持,BalusC。 – Thor 2012-01-13 19:04:18

+0

不客氣。 – BalusC 2012-01-13 19:06:50

相關問題