簡體   English   中英

無法在 Spring Boot 中使用自定義 HttpMessageNotReadableException 錯誤消息

[英]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.

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