2013-10-31 6 views
12

私のリクエストハンドラでは、いくつかの検証を行い、検証チェックの結果に基づいて別の応答(成功/エラー)を返します。そこで、レスポンスオブジェクトの抽象クラスを作成し、失敗の場合と成功した場合の2つのサブクラスを作成します。コードはこのように見えますが、errorResponseとsuccessResponseをAbstractResponseに変換できないと不平を言ってコンパイルしません。Spring MVC:ResponseEntity本体で異なる型を返す方法

私はJava Genericと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); 
} 
+0

'CreateUserSuccessResponse'は' AbstractResponse'を拡張しますか? –

+0

はい、CreateUserSuccessResponseとErrorResponseの両方がAbstractResponseを拡張しています。 – dnang

答えて

18

ここでは二つの問題があります。

  • あなたの戻り値の型はあなたが単純化された<>構文を使用することはできませんあなたのResponseEntityをインスタンス化するときに、2つの応答のサブクラスResponseEntity<? extends AbstractResponse>
  • と一致するように変更する必要がありますが、どのレスポンスクラスを使用するかを指定する必要があります。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); 
    } 
    
9

別のアプローチは、エラーハンドラ

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

を使用することでしょう。このアプローチは、任意の種類のオブジェクトを返す可能性を可能にし、成功事例やエラーの場合のように抽象スーパークラス(または場合でも)でありますもう必要ありません。

+0

+1、多くの場合 '@ExceptionHandler'は最もクリーンな選択です。 関連する例私の同僚が持っていた問題を解決するためにまとめました:https://gist.github.com/jonikarppinen/6ade2554946df21db0a6 – Jonik

関連する問題