2013-10-31 54 views
12

在我的請求處理程序中,我想做一些驗證,並根據驗證檢查的結果,我將返回不同的響應(成功/錯誤)。所以我爲響應對象創建了一個抽象類,併爲故障情況和成功案例創建了2個子類。代碼看起來像這樣,但它不能編譯,抱怨errorResponse和successResponse無法轉換爲AbstractResponse。Spring MVC:如何在ResponseEntity主體中返回不同類型

我對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); 
} 
+0

'CreateUserSuccessResponse'是否擴展'AbstractResponse'? –

+0

是的,CreateUserSuccessResponse和ErrorResponse都擴展AbstractResponse。 – dnang

回答

18

有兩個問題在這裏:

  • 您的返回類型必須改變以匹配兩個響應子類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); 
    } 
    
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

相關問題