Let 是我的自定义类型(请注意,没有 setter ,因为这是一个不可变值对象):
class CustomType extends ValueObject {
private String value;
@NotNull
public String getValue();
CustomType(String value) { this.value = value;}
CustomType(String prefix, String suffix) { this.value = prefix + suffix;}
public String getPrefix() { return value.substring(0, 4);}
public String getSuffix() { return value.substring(4);}
}
和我的 Controller :
@Controller
class MyController {
public ModelAndView processSubmittedForm(@Valid CustomType myObject, BindingResult result) {..}
}
和我的jsp View 表单:
<form>
<input id="prefixField" name="prefix" value="756." type="hidden">
<input id="suffixField" name="suffix" type="text">
...
<form/>
考虑到此 View 将发送两个 POST 参数 prefix
和 suffix
,我需要做什么才能将这两个参数与单个对象 myObject
绑定(bind),假设 Spring 将使用非空值对其进行验证?
我可以通过自定义 WebDataBinder、InitBinder、注册格式化程序或自定义编辑器或其他方式来实现此目的吗?
非常感谢您的帮助。
编辑: 以下是我在谷歌上搜索的相关文章,但没有找到与我自己的问题相匹配的解决方案:
- http://forum.springsource.org/showthread.php?130618-Custom-HandlerMethodArgumentResolver-that-uses-messageConverters
- Spring MVC customized method parameter binding
- Spring Partial Update Object Data Binding
- http://sergialmar.wordpress.com/2011/03/29/extending-handler-method-argument-resolution-in-spring-mvc/
- Custom WebArgumentResolver like @PathVariable
最佳答案
@fabien7474,你可以使用PropertiesEditor,因为如果我们稍微了解一下HTTP协议(protocol),请求中的所有参数都是String,当你需要执行一些类型转换或验证时,spring给你一个初始化binder的方法。
示例:
@Controller
class MyController {
public ModelAndView processSubmittedForm(@Valid MyObject myObject, BindingResult result) {..}
@InitBinder
public void initBinder (WebDataBinder binder) {
binder.registerCustomEditor(MyObject.class, new CustomObjectEditor());
}
}
class CustomObjectEditor {
@Override
public void setAsText(String text) throws IllegalArgumentException {
MyObject ob = new MyObject();
CustomType ct = new CustomType();
ct.setValue(text);
ob.setCustomType(ct);
super.setValue(ob);
}
}
通过这个示例,您可以看到一种对话类型。希望这对您有帮助。
关于java - 在 Spring Controller 中进行数据绑定(bind)期间,如何将请求中的两个字符串参数绑定(bind)到一种字段类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15787607/