簡體   English   中英

Spring MVC:如何在 ResponseEntity 主體中返回不同的類型

[英]Spring MVC: How to return different type in ResponseEntity body

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

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

這里有兩個問題:-

  • 您的返回類型必須更改以匹配兩個響應子類ResponseEntity<? extends AbstractResponse> 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, HTTPStatus.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;
}

這種方法可以返回任何類型的對象,因此不再需要用於成功案例和錯誤案例(甚至案例)的抽象超類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM