Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @FacesConverter阻止对p:selectOneMenu和p:ajax的方法调用_Java_Ajax_Jsf 2_Jboss7.x - Fatal编程技术网

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: