gpt4 book ai didi

jsf - 在 h :selectOneMenu results in Validation Error: Value not valid 中使用 JSF 转换器

转载 作者:行者123 更新时间:2023-12-04 16:58:11 27 4
gpt4 key购买 nike

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





Validation Error: Value is not valid

(3 个回答)


5年前关闭。




我有这个 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>
requestSituationArrayList充满 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 上设置选定的值所以我可以将它发送到 Business 方法。

最佳答案

你的转换器没问题。否则你会得到类似的转换错误

Conversion Error setting value 'com.example.RequestSituationVO@hashcode' for 'null Converter'


你有一个验证错误。当 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 放在 View 范围中而不在 getter 中执行业务逻辑来实现。或者,如果它实际上表示应用程序范围的数据,您可以将其重构为单独的应用程序范围的 bean。
    也可以看看
  • Our selectOneMenu wiki page
  • 关于jsf - 在 h :selectOneMenu results in Validation Error: Value not valid 中使用 JSF 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10605468/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com