リクエストハンドラーで検証を行い、検証チェックの結果に基づいて、さまざまな応答(成功/エラー)を返します。そこで、応答オブジェクトの抽象クラスを作成し、失敗した場合と成功した場合の2つのサブクラスを作成します。コードは次のようになりますが、コンパイルされず、errorResponseとsuccessResponseをAbstractResponseに変換できないと不平を言います。
私はJava=ジェネリックおよびSpring MVCにかなり慣れているので、これを解決する簡単な方法がわかりません。
@ResponseBody ResponseEntity<AbstractResponse> createUser(@RequestBody String requestBody) {
if(!valid(requestBody) {
ErrorResponse errResponse = new ErrorResponse();
//populate with error information
return new ResponseEntity<> (errResponse, HTTPStatus.BAD_REQUEST);
}
createUser();
CreateUserSuccessResponse successResponse = new CreateUserSuccessResponse();
// populate with more info
return new ResponseEntity<> (successResponse, HTTPSatus.OK);
}
ここには2つの問題があります。
ResponseEntity<? extends AbstractResponse>
_responseEntityをインスタンス化するときは、簡略化した<>構文を使用できないため、使用する応答クラスを指定する必要がありますnew ResponseEntity<ErrorResponse> (errResponse, HTTPStatus.BAD_REQUEST);
_@ResponseBody ResponseEntity<? extends AbstractResponse> createUser(@RequestBody String requestBody) {
if(!valid(requestBody) {
ErrorResponse errResponse = new ErrorResponse();
//populate with error information
return new ResponseEntity<ErrorResponse> (errResponse, HTTPStatus.BAD_REQUEST);
}
createUser();
CreateUserSuccessResponse successResponse = new CreateUserSuccessResponse();
// populate with more info
return new ResponseEntity<CreateUserSuccessResponse> (successResponse, HTTPSatus.OK);
}
_
別のアプローチは、エラーハンドラを使用することです
@ResponseBody ResponseEntity<CreateUserSuccessResponse> createUser(@RequestBody String requestBody) throws UserCreationException {
if(!valid(requestBody) {
throw new UserCreationException(/* ... */)
}
createUser();
CreateUserSuccessResponse successResponse = new CreateUserSuccessResponse();
// populate with more info
return new ResponseEntity<CreateUserSuccessResponse> (successResponse, HTTPSatus.OK);
}
public static class UserCreationException extends Exception {
// define error information here
}
@ExceptionHandler(UserCreationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ErrorResponse handle(UserCreationException e) {
ErrorResponse errResponse = new ErrorResponse();
//populate with error information from the exception
return errResponse;
}
このアプローチでは、あらゆる種類のオブジェクトを返す可能性があるため、成功した場合やエラーの場合(場合によっては)の抽象スーパークラスは不要になります。