11

すべてのパラメーターが渡されなかったときはいつでも 404 ページをトリガーしたいと考えています。次のURIがあるとしましょう:

/myapp/op?param1=1&param2=2@param3=3

パラメータが呼び出されなかった場合、404 ページを返したいと思います。私はやってみました:

@ResponseStatus(HttpStatus.NOT_FOUND)
@RequestMapping(value = "op", params = { "!param1" })
public void missingArg() {
}

しかし、その後、欠落している2番目と3番目のパラメーターを処理するメソッドの間にあいまいさがあることを示す例外が発生します。

では、どうすればこれを達成できますか?

4

3 に答える 3

27

Spring 3.1 を使用している場合は、次のように例外クラスを定義できます。

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public final class ResourceNotFoundException extends RuntimeException {
   //  class definition
}

その例外をスローするたびに、Spring は@ResponseStatusアノテーションで定義された http ステータスを返します。例えば:

@RequestMapping(value = "/op")
public void methodWithRequestParams(@RequestParam(value = "param1", required = false) String param1, 
        @RequestParam(value = "param2", required = false) String param2) {
  if (param1 == null || param2 == null) {
    throw new ResourceNotFoundException();
  }
}

404いつでも返すparam1param2、null です。

于 2012-04-29T15:56:21.173 に答える
7

関数を実装する必要はありませんmissingArg()。着信リクエストに一致するメソッドがない場合、SpringのHandlerExceptionResolverがそれを処理し、適切なステータスコードを含む応答を返します。

@RequestParamアノテーションを使用すると、Springはリクエストパラメータをメソッドパラメータに自動的に変換します。

@RequestMapping(value = "/op")
public void methodWithRequestParams(@RequestParam("param1") String param1, 
        @RequestParam("param2") String param2, 
        @RequestParam("param3") String param3) {

    // do something with params
}

慣例により、methodWithRequestParams()すべてのパラメータがリクエストの一部でない場合、メソッドは呼び出されません(のrequired属性がに@RequestParam設定されている場合を除くfalse)。

また、パラメータは文字列である必要はないことに注意してください。

于 2012-04-29T14:33:19.353 に答える