我正在使用 RestControllerAdvice 根據發生的例外型別回傳自定義回應(它們都是運行時例外),這是我今天第一次使用它,這是一種非常奇怪的體驗,因為在使用郵遞員和本地測驗時它有效完美,但是當我們部署到 Quality 時,它就不起作用了,每次出現例外時,前端甚至都沒有得到任何回應,但是在郵遞員中,它在發出確切請求時一直在作業,所以經過 5 個小時的嘗試不同我嘗試洗掉 @ResponseStatus 注釋,然后在發生例外時開始正確回應前端,也許我錯過了有關此注釋的某些內容,這是我的 RestControllerAdvice 的代碼無法正常作業(從前端呼叫時):
@RestControllerAdvice
public class SftpExceptionHandler {
@ExceptionHandler(FileTypeNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public GeneralResponse handlerRequestException(FileTypeNotFoundException ex) {
return new GeneralResponse(HttpStatus.NOT_FOUND, ex.getMessage());
}
@ExceptionHandler(IncorrectConsecutiveException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public GeneralResponse handlerRequestException(IncorrectConsecutiveException ex) {
return new GeneralResponse(HttpStatus.INTERNAL_SERVER_ERROR, ex.getMessage());
}
@ExceptionHandler(InvalidBinaryFileException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public GeneralResponse handlerRequestException(InvalidBinaryFileException ex) {
return new GeneralResponse(HttpStatus.BAD_REQUEST, ex.getMessage());
}
}
知道為什么 ResponseStatus 注釋會使其失敗嗎?如果我洗掉它,那么前端開始能夠像郵遞員一樣正確讀取回應
我的一個自定義例外示例:
public class InvalidBinaryFileException extends RuntimeException {
private static final long serialVersionUID = 1L;
public InvalidBinaryFileException(String message) {
super(message);
}
}
uj5u.com熱心網友回復:
在非常仔細地分析了一切之后,@ResponseStatus
這不是問題,它正在做它應該做的事情,但我將解釋發生了什么并將其留在這里以防其他人遇到這個問題,因為如果你使用它可能會很棘手第一次:
@RestControllerAdvice
public class SftpExceptionHandler {
@ExceptionHandler(IncorrectConsecutiveException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public GeneralResponse handlerRequestException(IncorrectConsecutiveException ex) {
return new GeneralResponse(HttpStatus.INTERNAL_SERVER_ERROR, ex.getMessage());
}
}
如您所見,我將錯誤設定@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
為內部服務器錯誤,這意味著錯誤 500,但是在我的代碼下方,我還在此處設定狀態和訊息new GeneralResponse(HttpStatus.INTERNAL_SERVER_ERROR, ex.getMessage());
因此,通過 Postman 發出請求,同時使用 @ResponseStatus
它看起來像這樣:
注意右上角的回應狀態是500 Internal Server Error
,在我的自定義回應中也是"code":500
。
現在請注意,在沒有 @ResponseStatus
您在上面看到的相同代碼的情況下,來自同一請求的回應將如何顯示:
至此,您已經可以看到有什么區別,沒有 @ResponseStatus 我們得到 200 作為狀態,但是我的自定義回應 (GeneralResponse) 物件仍然給出與之前相同的回應 with "code":500
,那么結論是什么?
結論:
前端總是期望一個 200 作為回應狀態,然后它可以評估 GeneralResponse 物件的內部代碼,所以問題不是@ResponseStatus
,它實際上是前端需要更新,所以它也可以讀取內部回應狀態為 500 左右的物件,希望對您有所幫助!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494845.html
下一篇:如何在application.yaml/properties中為spring.jackson.deserialization.wrap-exceptions=false配置代碼手冊