1

私のカスタムタイプにしましょう(これは Immutable Value Object であるため、セッターがないことに注意してください):

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/>

このビューが2 つの POST パラメータprefixsuffixmyObjectを送信することを考えると、null 以外の値で Spring によって検証されると仮定して、これら 2 つのパラメータを単一のオブジェクトにバインドするにはどうすればよい でしょうか?

WebDataBinder、InitBinder をカスタマイズしたり、Formatter を登録したり、カスタム エディターなどを使用したりして、これを実現できますか?

ご助力ありがとうございます。

編集:これは、私自身の問題に一致する解決策を1つも見つけずにグーグルで検索した関連記事です:

4

2 に答える 2

1

@ fabien7474、PropertiesEditor を使用できます。HTTP プロトコルを少し見てみると、リクエスト内のすべてのパラメーターが String であり、型変換または検証を実行する必要がある場合、Spring がバインダーを初期化する方法を提供するためです。

例:

@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 に答える