1

朋友们,我在 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) 类型。

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

谢谢你。

4

2 回答 2

3

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

使用以下算法获取转换器:
如果组件有一个附加的转换器,请使用它。
如果没有,请查找 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标签。

于 2010-04-07T17:12:45.057 回答
2

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

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

另一个类似的建议

于 2009-11-20T06:57:54.653 回答