【发布时间】:2013-11-12 21:33:23
【问题描述】:
我正在使用 Spring 表单标签来填充表单值。
我有表单支持对象:
public class FormInfo {
public enum Status {ON, OFF}
private Satus status;
//getter setter
...
}
在 JSP 中 Status 枚举是这样呈现的:
<form:form commandObject="formInfo " ...>
<form:select path="status">
<form:option value="null" label="Please select"/>
<form:options/>
</form:select>
</form:form>
一切正常,即默认消息和枚举值显示在 <select> 中。
但状态字段不是必需的,所以我希望允许用户不选择状态字段。但是如果表单提交时没有选择状态字段,那么我会收到错误:
字段“状态”上的对象“formInfo”中的错误:拒绝值 [null];
如何在未选择任何值时将枚举设置为 null?
请注意,我使用的是 JSR 303 验证。并且上述错误不会自动发生,我通过以下方法手动获取此错误消息BindingResult#getFieldErrors()。
这是我的控制器代码:
public void myMethod(@Valid @ModelAttribute("formInfo") FormInfo sourcingDetail, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
log.error("Error during validation is occurred." + bindingResult.getFieldErrors().toString()); // <-- this is error message
}
...
}
另外请注意,我没有在 status 字段上设置任何 JSR-303 注释(如 @NotNull)。
更新:
我通过调用此方法BindingResult#getFieldErrors() 得到的几乎完整的错误消息(如上所述):
验证期间发生错误。[对象“formInfo”中的字段错误 在字段“状态”上:拒绝值 [null];
...
[无法将“java.lang.String”类型的属性值转换为 属性“状态”的必需类型“com.my.project.model.Status”; 嵌套异常是 java.lang.IllegalStateException: 无法转换 [java.lang.String] 类型的值到所需类型 [com.my.project.model.Status] 属性“状态”:无匹配 找到编辑器或转换策略],
【问题讨论】:
-
这是完整的错误吗?它看起来不像是 Bean 验证错误。你有堆栈跟踪吗?
-
@Hardy 我更新了问题(向控制器方法添加了完整的错误消息和附加代码)。请审查它。谢谢。
-
看起来这是一个转换错误。前端给你一个字符串作为状态,但你需要一个 emum 类型。据我所知,与 Bean Validation 无关。我不确定 JSF 如何以及是否可以为您进行转换。