2013-10-24 2 views
5

@RequestBodyを使用しない場合、@PathVariableidは自動的にEntityクラスに設定されます。しかし、もし私が@RequestBodyを使っていれば、そうではありません。私のGenericValidatorが検証を実行する前に、idEntityに設定されている必要があります。なぜそれが@RequestBodyなしで動作するのですか?@PathVariableが@RequestBodyとバインドしていません

Entityクラス:

public class Entity { 

    private String id; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    //... 

} 

コントローラクラス:単独で使用する場合

@Controller 
@RequestMapping(value = "/entity") 
public class EntityController { 

    @Autowired 
    private GenericValidator validator; 

    @InitBinder 
    private void initBinder(WebDataBinder binder) { 
     binder.addValidators(validator); 
    } 

    @RequestMapping(value = "/{id}", method = RequestMethod.PUT) 
    public @ResponseBody Response update(
      @PathVariable String id, 
      @Valid @RequestBody Entity entity) 
    { 
     //... 
    } 
} 

答えて

3

、@Validはずっと@ModelAttributeのように動作します。 Entityメソッドの引数がモデルから取得されるかインスタンス化され、WebDataBinderがデータバインディングプロセスを処理します(IDが設定されるときです)。次に、検証が実行されます。

@RequestBody引数は@ModelAttribute引数のようなデータバインディングプロセスを経由しません。リクエストパラメータの名前とパス変数の名前をオブジェクトのフィールドの名前に一致させる代わりに、リクエストの本体を使用してHttpMessageConverterを介して作成されます。 @Validと組み合わせると、設定されたバリデーターは新しいオブジェクトに対して実行されますが、@ ModelAttributeスタイルのデータバインディングはまだ発生しません。

+1

@RequestBodyでこの作業を行う方法はありませんか? – dblank

関連する問題