1

让成为我的自定义类型(请注意,没有设置器,因为这是一个不可变的值对象):

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
class MyController {
  public ModelAndView processSubmittedForm(@Valid CustomType myObject, BindingResult result) {..}
}

和我的jsp视图表单:

<form>
    <input id="prefixField" name="prefix" value="756." type="hidden">
    <input id="suffixField" name="suffix" type="text">
...
<form/>

考虑到此视图将发送两个 POST 参数prefix,并且suffixmyObject假设 Spring 将使用非空值验证这两个参数,我需要做什么才能将这两个参数绑定到单个对象 ?

我可以通过注册格式化程序或自定义编辑器或其他方式自定义 WebDataBinder、InitBinder 来实现这一点吗?

非常感谢您的帮助。

编辑:以下是我用谷歌搜索的相关文章,但没有找到与我自己的问题相匹配的解决方案:

4

2 回答 2

1

@fabien7474,您可以使用 PropertiesEditor,因为如果我们稍微看一下 HTTP 协议,请求中的所有参数都是 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);

    }
}

通过此示例,您可以看到一种对话类型。希望这对您有所帮助。

于 2013-04-03T14:32:20.370 回答
0
<form>
<input id="prefixField" name="prefix" value="756." type="hidden">
<input id="suffixField" name="prefix" type="text">

...

Declare prefix field in your object(i.e commandName).
于 2015-07-16T11:25:33.117 回答