web-dev-qa-db-ja.com

Spring MVCの@RequestBodyパラメーターで@Validを使用するにはどうすればよいですか?

@Validのハンドラーメソッドのパラメーターで@Controllerを使用する際に問題が発生しました。私のコードは次のようになります:

@RequestMapping(value=BIBBLE_BOBBLE_URI_PATTERN + "/widgets", method=RequestMethod.POST)
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public Widget saveNewWidget(
        @PathVariable final String username,
        @PathVariable final String bibbleBobbleName,
        @Valid @RequestBody final Widget widget,
        final BindingResult results,
        final HttpServletRequest request,
        final HttpServletResponse response)

ここで、Widgetは私のドメインオブジェクトの1つのクラスです。 @RequestBodyアノテーションを使用して、リクエストのペイロードがwidgetにマップされることを示しています(私のテストでは、リクエストはJSONですが、Jacksonはクラスパス上にあるため、XMLも使用できます) 。

ご覧のとおり、BindingResultパラメーターはWidgetパラメーターの直後に続きますが、次のエラーが発生します。

Java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!

@Validアノテーションを@RequestBodyパラメーターに適用して、結果を取得するにはどうすればよいですか?

P.S. annotation-drivenを使用して、コントローラーの配線を処理したり、コンテンツネゴシエーションを行ったりしています。

20
Hank Gay

Spring 3.1を使用していますか?これは、Springバージョン3.1で新しく追加された機能です。 @ RequestBodyメソッド引数の検証 を参照してください。

9
Ritesh

これはSpring3.0の問題であり、3.1M2で修正されています。

https://jira.springsource.org/browse/SPR-6709

いくつかのスレッドと多読に基づいてSpring3.0を使用している場合、この問題に対する最善のアプローチは次のとおりです。この問題を修正するSpringのバージョンにアップグレードしたときに取り消すことができる、アスペクト指向のアプローチ。

@RequestMappingアノテーションを使用するメソッドへの呼び出しをインターセプトするアスペクトと、@ Validアノテーションが設定されているパラメーターごとに、アスペクト内の対応するバリデーターを呼び出します。

2
Chandra