【问题标题】:Submitting <h:selectManyListBox> causes "Validation Error: Value is not valid" [duplicate]提交 <h:selectManyListBox> 导致“验证错误:值无效”[重复]
【发布时间】:2010-12-18 15:06:23
【问题描述】:

朋友们,我在进行 Web 开发时又被卡住了,我正在为用户提供多项选择列表以供选择多个选项。 JSF 页面的片段

<h:selectManyListbox id="associatedAS" value="#{maintainForm.selectedAS}">
    <s:selectItems value="#{maintainForm.associatedAS}" var="as" label="#{as.name}" />
    <rmc:asConverter />
</h:selectManyListbox>

但问题是提交页面时我在控制台上遇到错误

sourceId=maintainForm:associatedAS[severity=(ERROR 2), summary=(maintainForm:associatedAS: Validation Error: Value is not valid), detail=(maintainForm:associatedAS: Validation Error: Value is not valid)]

我无法弄清楚为什么会发生这种情况,我在列表中显示的项目不是字符串,所以我编写了转换器“asConverter”,用于将值从其他对象转换为字符串,反之亦然。我上面在标签“#{maintainForm.selectedAS}”中给出的值也是 List (selectedAS) 类型。

任何形式的帮助表示赞赏。

谢谢。

【问题讨论】:

  • 实际上我已经实现了 equals 方法和自定义转换器,并且它与 selectOneMenu 一起工作得很好,但我在 selectManyListBox 中遇到了这个问题。所以我不认为转换器会是一个问题。
  • 您使用的是 Spring Faces 吗?如果是,请看这里,jira.springframework.org/browse/FACES-4
  • 不,我们没有使用弹簧面。

标签: validation jsf selectmanylistbox


【解决方案1】:

我和 Ravi Nikam 有同样的问题。实现了 Equals 方法和转换器,它适用于 selectOneMenu,但它提供了一个不错的 Validation Error: Value is not validselectManyListBox。 搜索了几个小时后,我找到了解决方案。 selectManyListbox 基于 javax.faces.component.UISelectManyUISelectMany 的 javadoc 说:

使用以下算法获取转换器: 如果组件有一个附加的转换器,请使用它。 如果没有,请查找 ValueExpression 的值(如果有)。 ValueExpression 必须指向以下内容: * 一个基元数组(例如 int[])。查找此原始类型的已注册的按类转换器。 * 对象数组(例如 Integer[] 或 String[])。为基础元素类型查找已注册的按类转换器。 * 一个 java.util.Collection。不要转换值。

所以这个列表中的最后一点导致了我的问题:“不要转换值”。

我在 faces-config.xml 中指定了

<converter>
    <converter-for-class>...
    <converter-class>...
</converter>

h:selectManyListbox 中我没有指定转换器。

我通过添加到 faces-config.xml 解决了这个问题

<converter-id>myConv</converter-id>

并将属性converter="myConv" 添加到h:selectManyListbox 标记。

【讨论】:

  • 具体来说,集合只能使用字符串。请参阅 Geary 和 Horstmann 第 3 版的“Core JavaServer Faces”,第 3 页。 163. 粗略地说:“selectMany 标记的值可以是集合而不是数组,但是……元素无法转换,因为在运行时不知道集合的元素类型。……这意味着,您应该使用集合仅适用于字符串。”
【解决方案2】:

当您向页面发送一些值,然后发送的部分或全部原始值被修改,或者在客户端上添加了一些新值时,就会出现此问题。如您所知,JSF 在服务器或客户端上保持其视图状态,这取决于您如何配置它,因此它在提交时使用该状态验证组件。在您的情况下,它发现发送给客户端的值不再相同。因此,您最终会收到此错误。

如果您使用的是自定义转换器,正如我在转换器页面上所描述的,您必须为您尝试转换的对象提供一个有效的 equals 方法。如果您尝试使用默认的 equals 方法或弄乱实现,则对象将无法正确转换,从而导致相当不直观的错误消息:“验证错误:值无效”。 - 参考:crazysquirrel.com

另一个similar suggestion

【讨论】:

  • 实际上我已经实现了 equals 方法和自定义转换器,并且它与 selectOneMenu 一起工作得很好,但我在 selectManyListBox 中遇到了这个问题。所以我不认为转换器会是一个问题。
  • 试着在你的 equals 方法中加入一些调试信息,看看到底发生了什么。
  • 您使用的是 Spring Faces 吗?如果是,请看这里,jira.springframework.org/browse/FACES-4
  • 我认为 Value is not valid 消息有多种原因,这可能不是 OP 的问题。请参阅@anonymous 的评论。
猜你喜欢
  • 2011-10-29
  • 2013-01-06
  • 1970-01-01
  • 2011-09-13
  • 2012-05-13
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
相关资源
最近更新 更多