在验证错误selectOneMenu用于结果:在H使用在JSF转换值无效[复制](Using JSF

2019-09-17 06:44发布

这个问题已经在这里有一个答案:

  • 验证错误:值无效 3个回答

我有这个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>

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>

我有这样的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;
    }
}

当我提出我的网页,我认为SelectOneMenu将自动设置为值requestSituation从方法requestVO 。 但是,当我提出,我得到一个消息Value not valid引用到我的SelectOneMenu

我需要的是设置在我所选择的值RequestSituationVO所以我可以将它发送到业务方法。

Answer 1:

你的转换器是罚款。 你本来已经获得了转换错误类似

对于“空转换器”转换错误设定值“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();
}

如果equals()的方法是没有问题的,则是后者的原因。 这可以通过确保得到解决#{orderController.requestSituation}显示表单和处理表单提交期间返回完全相同的清单。 这可以通过放置在视图范围bean并没有做业务逻辑在吸气都可以实现。 或者,如果它实际上代表应用程序范围的数据,你可以重构它到一个单独的应用程序作用域bean。

也可以看看

  • 我们selectOneMenu维基页面


Answer 2:

它看起来像你忘了实现equalshashCodeRequestSituation
这是非常重要的 ,因为JSF会比较对所有给定的项目提交的值。

如果不实现equals ,它认为提交的产品不在列表中,
因此它拒绝它。 ( The value is not valid.



文章来源: Using JSF Converter in h:selectOneMenu results in Validation Error: Value not valid [duplicate]
标签: jsf converter