在h:selectOneMenu中使用JSF Converter会导致验证错误:值无效

Ger*_*rep 3 jsf converter

我有这个SelectOneMenu:

<h:selectOneMenu value="#{orderController.requestVO.requestSituation}">
    <f:converter converterId="ComboConverter"/>
    <f:selectItems value="#{orderController.requestSituation}" var="requestSituation"
                                                   itemLabel="#{requestSituation.description}" itemValue="#{requestSituation}" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

requestSituation是一个ArrayList填充RequestSituationVO 它正确填充,生成此HTML:

<select name="j_idt14:j_idt20" size="1">
        <option value="13">Pedido Recusado</option>
    <option value="11">Pedido Validado</option>
    <option value="12" selected="selected">Pedido Confirmado</option>
    <option value="12" selected="selected">Pedido Faturado</option>
</select>
Run Code Online (Sandbox Code Playgroud)

我有这个Converter,这里是我困惑的地方,我已经阅读了很多,我知道它必须做什么,但不知道它是如何工作的.

这里是:

@FacesConverter(value = "ComboConverter", forClass = RequestSituationVO.class)
public class ComboConverter implements Converter
{

    private static RequestSituationVO requestSituationVO = new RequestSituationVO();

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value)
    {
        requestSituationVO.setId(Integer.valueOf(value));
        requestSituationVO = (RequestSituationVO) new RequestSituationBO().getRequestSituation(requestSituationVO).toArray()[0];
        return (RequestSituationVO) requestSituationVO;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value)
    {
        requestSituationVO = (RequestSituationVO) value;
        String teste = String.valueOf(requestSituationVO.getId());
        return teste;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我提交我的页面时,我认为SelectOneMenu会自动设置requestSituation方法的值requestVO.但是当我提交时,我收到一条Value not valid引用我的信息SelectOneMenu.

我需要的是设置我的选定值,RequestSituationVO以便我可以将它发送到Business方法.

Bal*_*usC 10

你的转换器很好.否则你会得到转换错误

'null Converter'的转换错误设置值'com.example.RequestSituationVO@hashcode'

你有一个验证错误.如果Object#equals()true对列表中的任何可用项目返回所选项目的测试,则会抛出此特定项目.JSF正在检查以防止被篡改的请求发起攻击.在您的特定情况下,这可能有以下原因:

  • 该类的equals()方法RequestSituationVO缺失或损坏.
  • #{orderController.requestSituation}发生了不相容改变在显示形式的请求并处理所述表单提交的请求之间.

我认为这是前者.鉴于您RequestSituationVO有一个Integer id唯一标识对象的属性,这应该做:

@Override
public boolean equals(Object other) {
    return (other instanceof RequestSituationVO) && (id != null)
        ? id.equals(((RequestSituationVO) other).id)
        : (other == this);
}

@Override
public int hashCode() {
    return (id != null)
        ? (this.getClass().hashCode() + id.hashCode())
        : super.hashCode();
}
Run Code Online (Sandbox Code Playgroud)

如果equals()方法不是问题,那么它就是后一种原因.这可以通过确保#{orderController.requestSituation}在显示表单和处理表单提交期间返回完全相同的列表来解决.这可以通过将bean放在视图范围中而不是在getter中完成业务逻辑来实现.或者,如果它实际上代表了应用程序范围的数据,您可以将其重构为单独的应用程序范围的bean.

也可以看看