【问题标题】:Where does "Validation Error: Value is not valid" come from [duplicate]“验证错误:值无效”来自哪里[重复]
【发布时间】:2013-11-21 09:47:57
【问题描述】:

我有一个 JSF 表单和一个托管 bean。提交我的表单后,其中一个输入返回

sendMessage:template: 验证错误:值无效

我相信这些是表单和输入的名称。但是,无论是在 JSF 页面还是在 bean 上,我都没有对该字段进行验证。这怎么可能?

这里是有问题的字段:

<p:selectOneMenu id="template" value="#{sendMessageController.template}">  
                    <f:selectItems value="#{sendMessageController.availableTemplates}"  />
                </p:selectOneMenu>  

和托管 bean:

@ManagedBean(name="sendMessageController")
@RequestScoped
public class SendMessageController {
    ....
    private String template;
    private List<String> availableTemplates = new ArrayList<String>();

【问题讨论】:

  • 你能贴一些代码吗?
  • 哪个类型有bean中的值?也许有一些必要的转换失败了。

标签: validation jsf primefaces


【解决方案1】:

从使用&lt;f:selectItem(s)&gt;UISelectOne/UISelectMany 组件可以识别此验证错误,例如&lt;h:selectOneMenu&gt;。当在 equals() 与任何可用项目的检查中所选值未返回 true 时,将发生此验证错误。

这又具有三个可能的原因:

  1. 选择项值的equals() 方法丢失或损坏。
  2. 可用项目列表在显示和提交表单之间发生了不兼容的变化。
  3. 如果有任何涉及,Converter 已返回错误的项目,甚至在 getAsObject() 中返回了 null

另见:

【讨论】:

  • 我认为我的问题是 2。我还有两个其他输入用于计算 selectOne 中可用的内容
  • 然后确保它不会发生不兼容的变化。例如。将 bean 放在视图范围内,或在请求范围 bean 的(后)构造函数中重新创建相同的列表。如果需要一些额外的参数,只需传递它们。
  • 调试问题似乎是在提交后调用了 postconstruct,此时用于获取 availableTemplates 的其他字段的值为 null(即使它们已由页面中填充用户)所以我无法重置可用模板。我不明白为什么会这样,因为我已经调用了 Web 服务来获取这些值,我宁愿避免再次这样做。
  • 这是因为你的 bean 是 request 范围的。每个 HTTP 请求在逻辑上都会创建一个新的 bean 实例。显示表单算作一个 HTTP 请求。每个 ajax 请求都算作一个 HTTP 请求。提交表单算作一个 HTTP 请求。这就是 HTTP 的工作原理。同样,按照建议,只要您与相同的表单交互,将 bean 放在视图范围内以保持实例处于活动状态。另见stackoverflow.com/questions/7031885/…
  • 哦。当然。它应该是会话范围的。
猜你喜欢
  • 2011-10-29
  • 2013-01-06
  • 2011-07-21
  • 2011-09-13
  • 2012-05-13
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
相关资源
最近更新 更多