我在使用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 null
changed()
被稱爲(一次)。我不認爲它是Primefaces相關的,因爲如果我使用h:selectOneMenu
和f:ajax
,我具有相同的行爲。
@Ondra:這個問題到底如何與JBoss AS 7相關?這樣你就意味着問題不會在其他服務器上出現,這對於這個特殊問題是不真實的。 – BalusC 2012-02-19 17:14:43