【问题标题】:Converter in JSF (PrimeFaces) with SelectOneMenu: Validation Error带有 SelectOneMenu 的 JSF (PrimeFaces) 中的转换器:验证错误
【发布时间】:2013-08-27 15:28:11
【问题描述】:

我正在使用 PrimeFaces 在 JSF 中创建一个项目,但我遇到了 <p:SelectOneMenu> 的问题,特别是从对象到字符串的选定值的转换。我已经编写了所需的 Converter 类,实现了 toString()equals() 方法,我认为非常正确。但是,在 <h:messages /> 组件中,它不断地给我:

j_idt7:j_idt92: Validation Error: Value is not valid
j_idt7:j_idt98: Validation Error: Value is not valid

我必须选择属于更大形式的值。然后,根据选择的所有者 (właściciel) 和公司 (firma),我将它们添加到数据库中。

这是我的<p:SelectOneMenu>(两次 - 两个菜单):

<p:selectOneMenu value="#{wniosek.selectedWl}" var="w">
<f:selectItem itemLabel="Wybierz" itemValue=""/>
   <f:selectItems value="#{wniosek.listaWl}" var="wlasciciel" 
      itemLabel="#{wlasciciel.nazwisko}" itemValue="#{wlasciciel}" />

      <p:column>
          #{w.nazwisko}
      </p:column>
      <f:converter converterId="WlascicielConverter" />
</p:selectOneMenu>                      
 <h:outputText value="Nazwa firmy: "/>

 <p:selectOneMenu value="#{wniosek.selectedFi}"  var="f">
      <f:selectItem itemLabel="Wybierz" itemValue=""/>
      <f:selectItems value="#{wniosek.listaFi}" var="firma" 
           itemLabel="#{firma.nazwa}" itemValue="#{firma}" />
      <f:converter converterId="FirmaConverter" />
      <p:column>
           #{f.nazwa}
      </p:column>
 </p:selectOneMenu>

这是我的所有者&lt;p:SelectOneMenu&gt; 的转换器类(与公司类似):

public class WlascicielConverter implements Converter {

int i = 0;
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
    try {           
        if (arg2 == null || arg2.isEmpty()) {
            return null;
        }
        String owner = arg2;
        return WlascicielBean.findAnOwner(owner);

    } catch (SQLException e) {
        e.printStackTrace();
        return null;
    }
}

@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {

    if(arg2 == null) return null;

    Wlasciciel owner = new Wlasciciel();

    if(arg2 instanceof Wlasciciel) {
        owner = (Wlasciciel)arg2;
        System.out.println(owner.getNazwisko());
        String surname = owner.getNazwisko();
        return (surname != null) ? String.valueOf(surname) : null;
    } else throw new ConverterException("Something wrong!" + arg2.hashCode() + arg2.toString());

}

}

equals() 方法:

@Override
public boolean equals(Object obj) {
    if (obj == this) return true;
    if (!(obj instanceof Wlasciciel)) return false;

    Wlasciciel wl = (Wlasciciel)obj;
    if (this.id_w != wl.getId_w()) return false; 
    if (!this.nazwisko.equals(wl.getNazwisko())) return false; 
    if (!this.imie.equals(wl.getImie())) return false;      
    if (!this.ulica.equals(wl.getUlica())) return false; 
    if (this.nr != wl.getNr()) return false; 
    if (this.lokal != wl.getLokal()) return false; 
    if (this.id_n != wl.getId_n()) return false; 

    return true;
}

你能给我一些关于解决这个问题的提示吗?我已经阅读了很多关于 JSF 中转换器的教程,尝试了很多方法来改进它,但它仍然不起作用。我不知道......也许问题出在我的代码中的其他地方?由于篇幅太长,这里就不贴了(当然,如果有必要,我会做的)。

【问题讨论】:

    标签: validation jsf converter selectonemenu


    【解决方案1】:

    总的来说,我认为您的方法是正确的,尽管非英语代码让您很难理解您实际在做什么......

    会发生什么:你有一个集合。您的 Converter 运行该集合并在每个对象上调用 getAsString()。在您在浏览器中选择某些内容后,valuegetAsString() 的返回值)将被传输到转换器并调用getAsObject()。这是一个全新的对象,不一定是以前的集合之一(除非您的 Converter 将实际访问该集合并从那里获取它)。之后,JSF 将获取用于生成 selectOneMenu 的集合,并将每个项目与转换器返回的项目进行比较。

    这可能由equals()hashCode() 发生,具体取决于使用的集合。所以你需要同时覆盖两者(实际上你应该这样做)。

    如果 JSF 从集合中找不到任何与转换器返回的对象相匹配的对象(equals 为真,或者 hashCode 相同),那么您将得到 Validation Error: Value is not valid

    我希望能稍微清理一下这个过程。我的猜测是你要么必须实现hashCode(),要么你的equals() 方法是错误的。总体设置是正确的。您需要调试并检查为什么 JSF 无法在您的列表中找到该对象。

    【讨论】:

    • 另一个可能的原因是&lt;f:selectItems value&gt; 列表在表单提交期间发生了变化。另请参阅stackoverflow.com/questions/9069379/… 无论如何破译波兰代码的荣誉:)
    • 我仍在努力解决这个问题。我试图检查转换器工作不正常的原因,我发现getAsString 方法中的arg2 对象是String,而不是Wlascicel 对象(但它应该是,不是吗?)。所以我收到ClassCastException - 它无法将String 转换为Wlasciciel。我已经编辑了之前的列表并插入了一个最新的转换器。我真的不知道,怎么了。
    猜你喜欢
    • 2011-10-31
    • 2013-04-10
    • 2013-07-18
    • 2011-05-31
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    相关资源
    最近更新 更多