[英]Unable to use custom HttpMessageNotReadableException error message in Spring Boot
我目前正在嘗試為異常提供自定義消息,但遇到了 HttpMessageNotReadableException 的問題。
我有一個 ErrorDetails 類:
public class ErrorDetails {
private Date timestamp;
private String message;
private String details;
public ErrorDetails(Date timestamp, String message, String details) {
super();
this.timestamp = timestamp;
this.message = message;
this.details = details;
}
public Date getTimestamp() {
return timestamp;
}
public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
我還有一個自定義異常處理程序:
@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
@RestController
public class CustomizedExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(HttpMessageNotReadableException.class)
@Override
public final ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request){
ErrorDetails errorDetails = new ErrorDetails(new Date(), "hello",request.getDescription(true));
errorDetails.setMessage("Testing message");
return new ResponseEntity<>(errorDetails,HttpStatus.NOT_ACCEPTABLE);
}
}
但是,當我嘗試發布錯誤請求時,例如,使用應該具有整數值的字段時,我在 JSON 中傳遞了一個字符串,它仍然返回以下默認錯誤消息:
{
"timestamp": "2019-03-12T00:15:14.210+0000",
"status": 400,
"error": "Bad Request",
"message": "JSON parse error: Cannot deserialize value of type `int` from String \"lala\": not a valid Integer value; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `int` from String \"lala\": not a valid Integer value\n at [Source: (PushbackInputStream); line: 5, column: 17] (through reference chain: com.tdl.model.ToDoNote[\"priority\"])",
"path": "/todos"
}
JSON 請求:
{
"name": "An workout",
"dateToComplete": "Today",
"description": "Sleep Day",
"priority": "lala",
"completed": false
}
所需的效果只是出現測試消息而不是長描述。
我也在我的 Eclipse 控制台中得到了這個:
WARN 16508 --- [nio-5000-exec-4] .wsmsDefaultHandlerExceptionResolver:已解決 [org.springframework.http.converter.HttpMessageNotReadableException:JSON 解析錯誤:無法從字符串“lala”反序列化
int
類型的值:不是有效的整數值; 嵌套異常是 com.fasterxml.jackson.databind.exc.InvalidFormatException:無法從字符串“lala”反序列化int
類型的值:在 [Source: (PushbackInputStream); 處不是有效的整數值; line: 5, column: 17] (通過引用鏈: com.tdl.model.ToDoNote["priority"])]
我將狀態更改為 NOT_ACCEPTABLE 只是為了更清楚地查看是否返回了我的自定義錯誤。
任何幫助,將不勝感激。 謝謝你。
編輯
為 InvalidFormatException 添加了 ExceptionHandler,但沒有任何改變。 我仍然收到與以前相同的默認錯誤(異常)消息。
@ExceptionHandler(InvalidFormatException.class)
public final ResponseEntity<Object> handleInvalidFormat(InvalidFormatException ex, HttpHeaders headers, HttpStatus status, WebRequest request){
ErrorDetails errorDetails = new ErrorDetails(new Date(), "hello",request.getDescription(true));
errorDetails.setMessage("Testing message");
return new ResponseEntity<>(errorDetails,HttpStatus.NOT_ACCEPTABLE);
}
我遇到了這個錯誤 HttpMessageNotReadableException,我覺得需要自定義它。 經過幾次試驗,我最終得到了一種更好、更易讀的格式。 第 1 步:創建一個自定義錯誤詳細信息類,其中包含您希望向客戶端公開的字段。 下面是我創建的。
public class ErrorDetails {
private final Date timestamp;
private final String message;
private final String details;
public ErrorDetails(Date timestamp, String message, String details) {
this.timestamp = timestamp;
this.message = message;
this.details=details;
}
// 為簡潔起見,不包括 getter
第 2 步:創建一個將擴展 ResponseEntityHandler 的類,該類具有可以被覆蓋的異常。 在這里,重寫handleHttpMessageNotReadbale 方法,然后在該方法中實現您自己的自定義錯誤處理程序。
@ControllerAdvice 公共類 GlobalExceptionHandler 擴展 ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(
HttpMessageNotReadableException ex,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(),request.getDescription(false));
return new ResponseEntity<>(errorDetails, HttpStatus.BAD_REQUEST);
}
}
第 3 步:使用錯誤的輸入字段運行 POST 或 PUT 方法並檢查結果。 例如,gender 是一個只有 FEMALE 和 MALE 的枚舉類。
{
"firstName":"Dell",
"lastName":"HP",
"birthYear":"2000-02-12",
"email":"dell@gmail.com",
"gender":"BOY"
}
響應如下:
{ "timestamp": "2022-06-06T08:08:53.906+00:00", "message": "JSON 解析錯誤:無法從字符串 "BOY" 反序列化com.io.clinic.utils.Gender
類型的值:不是枚舉類接受的值之一:[FEMALE,MALE];嵌套異常是 com.fasterxml.jackson.databind.exc.InvalidFormatException:無法從字符串“BOY”反序列化com.io.clinic.utils.Gender
類型的值:不是枚舉類接受的值之一:[FEMALE,MALE]\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 6, column: 14] (通過參考鏈:com.io .clinic.payloadDTO.PatientDTO["gender"])", "details": "uri=/api/v1/patients" } 我很滿意讓消息處於該狀態以進行調試,但您也可以自定義消息響應被覆蓋的方法。
問題已經解決了。 我將自定義異常類放在一個命名錯誤的包中。 它被稱為只是例外。 雖然它應該是整個項目所在的 com.app.exception。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.