Java @FacesConverter阻止对p:selectOneMenu和p:ajax的方法调用
在Java @FacesConverter阻止对p:selectOneMenu和p:ajax的方法调用,java,ajax,jsf-2,jboss7.x,Java,Ajax,Jsf 2,Jboss7.x,在p:selectOneMenu(PrimeFaces3.0)中进行AJAX调用时,JBoss-7.1.0.CR1b的自定义@faces转换器出现了一个奇怪的问题 简化的转换器如下所示,该类中没有NPE或其他异常 @FacesConverter("MyConverter") public class MyConverter implements Converter { public Object getAsObject(FacesContext fc, UIComponent u
p:selectOneMenu
(PrimeFaces3.0)中进行AJAX调用时,JBoss-7.1.0.CR1b的自定义@faces转换器出现了一个奇怪的问题
简化的转换器如下所示,该类中没有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>
但是现在令人恼火的部分是:changed()
从来没有像上面那样用代码调用过,但是我调用了三次转换器:
如果我将p:selectOneMenu值=“#{clientBean.selectedId}”
更改为long selectedId
,并且不使用转换器,该方法将被调用一次。即使在getAsObject()
中我returnnull
,也会调用changed()
。我不认为它与Primefaces相关,因为如果我使用h:selectOneMenu
和f:ajax
,你应该有一个在你的视图中经过ajax更新的
,
或
,我有同样的行为。您还应该注意服务器日志中关于可能丢失的faces消息的警告。您很有可能看到臭名昭著的验证错误:Value not valid
验证错误
转换后,JSF将验证提交的对象是否是可用项之一,作为防止篡改/黑客请求的一部分。JSF将通过submittedObject.equals(一个可用对象)
为每个可用对象实现这一点,就像您在
中看到的那样。如果没有匹配项,那么JSF将显示此验证错误
在您的特定情况下,MyEjb
类显然没有equals()
方法,或者它的实现被破坏了。另请参见。我已经实现了等于
,正如您描述的技术平等,它就像一个符咒。再次感谢您的支持,巴卢斯克。@Ondra:这个问题与JBossAS7有什么关系?这样,您就意味着问题不会在其他服务器上表现出来,这对于这个特定的问题是不正确的。
public void changed()
{
logger.info("changed() "+selected);
}
12:37:51,500 DEBUG getAsObject value: 35
12:37:51,502 DEBUG getAsObject value:
12:37:51,503 DEBUG getAsObject value: