web-dev-qa-db-ja.com

オブジェクトを返すSpring MVC @RestController @ResponseBodyクラスでHTTPステータスコードで応答する方法は?

私は@RestController@PathVariable特定のオブジェクトをJSON形式で、適切なステータスコードとともに返します。これまでのコードは、デフォルトでJacksonライブラリに組み込まれたSpring 4を使用しているため、JSON形式でオブジェクトを返します。

しかし、私はそれを作成する方法がわかりませんので、API変数、JSONデータ、エラーコード(またはすべてがうまくいったかどうかに応じて成功コード)が欲しいというメッセージをユーザーに提供します。出力例は次のとおりです。

パラメーターとしてAPI値を入力してください(必要に応じてJSONでも可能です)

{"id":2、 "api": "3000105000" ...}(これはJSON応答オブジェクトになります)

ステータスコード400(または適切なステータスコード)


パラメータ付きのURLは次のようになります

http://localhost:8080/gotech/api/v1/api/3000105000

私がこれまでに持っているコード:

@RestController
@RequestMapping(value = "/api/v1")
public class ClientFetchWellDataController {

    @Autowired
    private OngardWellService ongardWellService;

    @RequestMapping(value = "/wells/{apiValue}", method = RequestMethod.GET)
    @ResponseBody
    public OngardWell fetchWellData(@PathVariable String apiValue){
        try{
            OngardWell ongardWell = new OngardWell();
            ongardWell = ongardWellService.fetchOneByApi(apiValue);

            return ongardWell;
        }catch(Exception ex){
            String errorMessage;
            errorMessage = ex + " <== error";
            return null;
        }
    }
}
29
Cris

@RestControllerはこれには適していません。さまざまな種類の応答を返す必要がある場合は、ResponseEntity<?>を使用して、ステータスコードを明示的に設定できます。

bodyResponseEntityは、@ResponseBodyアノテーション付きメソッドの戻り値と同じ方法で処理されます。

@RequestMapping(value = "/wells/{apiValue}", method = RequestMethod.GET)
public ResponseEntity<?> fetchWellData(@PathVariable String apiValue){
    try{
        OngardWell ongardWell = new OngardWell();
        ongardWell = ongardWellService.fetchOneByApi(apiValue);

        return new ResponseEntity<>(ongardWell, HttpStatus.OK);
    }catch(Exception ex){
        String errorMessage;
        errorMessage = ex + " <== error";
        return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);
    }
}

@ResponseBody注釈付きクラス内の@RequestMappingメソッドで@RestControllerは必要ないことに注意してください。

61

慣用的な方法は、通常のリクエスト処理メソッドで例外をキャッチする代わりに、例外ハンドラを使用することです。例外のタイプにより、応答コードが決まります。 (セキュリティエラーの場合は403、予期しないプラットフォームの例外の場合は500、好きなもの)

@ExceptionHandler(MyApplicationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleAppException(MyApplicationException ex) {
  return ex.getMessage();
}

@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String handleAppException(Exception ex) {
  return ex.getMessage();
}
31
Affe