web-dev-qa-db-ja.com

Spring MVC:ResponseEntityボディで異なるタイプを返す方法

リクエストハンドラーで検証を行い、検証チェックの結果に基づいて、さまざまな応答(成功/エラー)を返します。そこで、応答オブジェクトの抽象クラスを作成し、失敗した場合と成功した場合の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);
}
15
dnang

ここには2つの問題があります。

  • 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);
    }
    _
23
gadget

別のアプローチは、エラーハンドラを使用することです

@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;
}

このアプローチでは、あらゆる種類のオブジェクトを返す可能性があるため、成功した場合やエラーの場合(場合によっては)の抽象スーパークラスは不要になります。

11
Ruben