【问题标题】:Using JSF Converter in h:selectOneMenu results in Validation Error: Value not valid [duplicate]在 h:selectOneMenu 中使用 JSF 转换器导致验证错误:值无效 [重复]
【发布时间】:2012-05-23 05:51:35
【问题描述】:

我有这个 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 会自动从requestVO 设置requestSituation 方法的值。但是当我提交时,我会收到一条消息Value not valid,引用我的SelectOneMenu

我需要在我的RequestSituationVO 上设置选定的值,以便将其发送到业务方法。

【问题讨论】:

    标签: jsf converter


    【解决方案1】:

    你的转换器很好。否则你会得到类似的转换错误

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

    您有一个验证错误。当所选项目的Object#equals() 测试未针对列表中的任何可用项目返回true 时,将抛出这个特定的。 JSF 正在检查以防止被篡改请求的攻击。在您的特定情况下,这可能有以下原因:

    • RequestSituationVO 类的 equals() 方法丢失或损坏。
    • #{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 放在视图范围内而不在 getter 中执行业务逻辑来实现。或者,如果它实际上表示应用程序范围的数据,您可以将其重构为单独的应用程序范围 bean。

    另见

    【讨论】:

      【解决方案2】:

      您似乎忘记在RequestSituation 中实现equalshashCode
      非常重要,因为 JSF 会将提交的值与所有给定的项目进行比较。

      如果不执行equals,则认为提交的项目不在列表中,
      所以它拒绝它。 (The value is not valid.)

      【讨论】:

      • 谢谢,我会尝试并报告。
      猜你喜欢
      • 2012-11-25
      • 2013-05-20
      • 2011-10-31
      • 2011-09-13
      • 2011-06-01
      • 1970-01-01
      • 2010-12-18
      • 2012-07-01
      相关资源
      最近更新 更多