2

@RequestMapping何かを行う注釈付きのコントローラーメソッドがいくつかあります。彼らはそれぞれ、私たちが拘束されたいという複数の議論を持っています. 例えば:

@RequestMapping(value = "/a/b", method = RequestMethod.GET)
@ResponseBody
public Response getAB(ARequest aRequest, BRequest bRequest) throws ServiceException {
    ...
}

これは明らかにうまく機能します。ただし、要件の 1 つの癖は、アンダースコアを含む要求パラメーターを取得することです。例えば; 上記のエンドポイントでは、次のようなリクエストを受け取りますhttp://x:8000/a/b?req_param=1。これにより、デフォルトの Spring バインディングが失敗します。これは、バインドしたいオブジェクトでは、Java コードでアンダースコアを使用するのではなく、req_paramキャメルケース ( ) を定義するためです。reqParam

これを解決するために、Spring コンテキストに登録した独自のアノテーション ( @Camelize) と独自の customを実装しました。WebArgumentResolver次に、コントローラー メソッドの引数に で注釈を付けます@Camelize。これにより、カスタムWebArgumentResolverが介入してバインディングを修正します。これもうまくいきます。

ここで問題が発生します。より具体的には、引数も検証したい場合、これが失敗するように見えます。たとえば、上記の例を続けると、次のようになります。

@RequestMapping(value = "/a/b", method = RequestMethod.GET)
@ResponseBody
public Response getAB(@Camelize @Valid ARequest aRequest, Errors aRequestErrors, BRequest bRequest) throws ServiceException {
    ...
}

これは例外で失敗します: java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!.

カスタムを使用して同時にWebArgumentResolver検証することはできないようです。これが を返さないとすぐに、Spring MVC は検証を気にせず、上記の例外をスローするという意味で@Valid、 custom に絞り込みました。WebArgumentResolverUNRESOLVED

  • これが予想される動作であることを誰かが確認できますか?
  • これに対する回避策はありますか? 現在、カスタムWebArgumentResolverを削除してフィルターに置き換えることを考えていますが、これは私たちが必要としているものにとって非常に邪魔に思えます.

ありがとう!

編集: Spring 3.0.5 を使用しています。

4

0 に答える 0