问题描述: 前端网页有一个包含十来个 field 的表单。 后端的 Spring MVC 的 Controller 中处理表单的代码类似这样:
@RequestMapping(value = "edit", method = POST)
public String doPost(@Nonnull final Student student) {
...
}
Student 类中有一个 field 是 boolean 类型。现在有一个需求,转换表单中的某一个 String 成为 Student 中的 boolean 属性。转换过程比较复杂,所以需要自定义转换的代码。
楼主 Google 了好久,发现使用 PropertyEditorSupport 可能可以解决这个问题,于是首先自定义了一个 PropertyEditor :
public class MyEditor extends PropertyEditorSupport {
@Override
public void setAsText(final String text) throws IllegalArgumentException {
final boolean b = ....
setValue(b);
}
}
然后在 Controller 中注册 MyEditor ,代码如下:
@InitBinder
protected void initBinder(final WebDataBinder binder) {
binder.registerCustomEditor(boolean.class, new MyEditor());
binder.registerCustomEditor(Boolean.class, new MyEditor());
}
以防万一, boolean 和 Boolean 都注册了。 运行代码,发现 initBinder 被调用了,但是 setAsText 没有被调用。 楼主又写了一个只有一个 field 的简单表单,测试看看是否注册 MyEditor 注册成功,代码如下:
@RequestMapping(value = "/test", method = POST)
public String test(final boolean test) {
...
}
对于这个简单的 controller 方法, setAsText 有被调用。 所以问题是出现在哪里呢?如何解决表单提交时自定义 field 绑定的问题?谢谢~
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.