web-dev-qa-db-ja.com

アノテーション駆動型Spring MVCで@ResponseStatusを動的に変更する

これがSpring 3.2 MVCを使用して実行可能かどうかは本当にわかりません。

私のコントローラーには以下のように宣言されたメソッドがあります:

_@RequestMapping(method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody List<Foo> getAll(){
    return service.getAll();
}
_

質問:

  1. @ResponseStatus(HttpStatus.OK)の意味は何ですか?
  2. メソッドが常に_HttpStatus.OK_ステータスコードを返すことを意味しますか。
  3. サービス層から例外がスローされるとどうなりますか?
  4. 例外の発生時に応答ステータスを変更できますか?
  5. 同じ方法で条件に応じて複数の応答ステータスを処理するにはどうすればよいですか?
31
dharam

@ResponseStatus(HttpStatus.OK)は、処理メソッドが正常に戻った場合に要求がOKを返すことを意味します(この場合、デフォルトの応答ステータスはHttpStatus.OKであるため、この注釈は冗長です)。ハンドラーが例外をスローした場合、注釈は適用されません。

同じ方法で条件に応じて複数の応答ステータスを処理するにはどうすればよいですか?

その質問 既に質問されています

例外の発生時に応答ステータスを変更できますか

2つの選択肢があります。例外クラスが独自のクラスの場合、@ResponseStatusを使用して例外クラスに注釈を付けることができます。もう1つの選択肢は、@ExceptionHandlerアノテーションが付けられた例外ハンドラーをコントローラークラスに提供し、例外ハンドラーに応答ステータスを設定させることです。

27
Raedwald

ResponseEntityを直接返す場合、その中にHttpStatusを設定できます。

// return with no body or headers    
return new ResponseEntity<String>(HttpStatus.NOT_FOUND);

404以外のエラーを返したい場合は、 HttpStatusには他の多くの値があります から選択します。

12
Ron Lunde

@ResponseStatusに複数のステータス値を設定することはできません。私が考えることができる1つのアプローチは、@ExceptionHandlerではない応答ステータスにHttpStatus.OKを使用することです

@RequestMapping(value =  "login.htm", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
public ModelAndView login(@ModelAttribute Login login) {
    if(loginIsValidCondition) {
        //process login
        //.....
        return new ModelAndView(...);
    }
    else{
        throw new InvalidLoginException();
    }
}

@ExceptionHandler(InvalidLoginException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ModelAndView invalidLogin() {
    //handle invalid login  
    //.....
    return new ModelAndView(...);
}
9
Bnrdo