我正在使用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>
中。
但是状态字段不是必需的,所以我希望允许用户取消选中状态字段。但是如果提交的表单没有选择状态字段,那么我会收到错误:
字段'status'上对象'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'中的字段错误 在字段'status'上:被拒绝的值[null];
...
[无法将'java.lang.String'类型的属性值转换为 属性'status'需要输入'com.my.project.model.Status'; 嵌套异常是java.lang.IllegalStateException:无法转换 类型[java.lang.String]的值为必需的类型 [com.my.project.model.Status]属性'status':没有匹配 编辑或转换策略发现],
答案 0 :(得分:3)
看起来你和我有同样的问题!
控制器中有一个方法用作钩子,您可以在其中指定如何将来自HTTP请求的String值转换为具体对象! 该方法称为initBinder,您可以附加正确的行为来正确进行转换。我还在研究,但到目前为止看起来还不错。
看看这个:
希望找到解决方案有所帮助!
问候
胜者。