我正在使用 Spring Boot 創建一個 POST 請求,我需要根據用戶輸入驗證請求正文。但是,當用戶輸入無效資料型別時,回應不顯示任何內容,僅顯示400 bad request狀態。我可以添加一條訊息來向用戶顯示哪個欄位是無效資料型別嗎?
例如:這是我的控制器:
@RestController
@RequestMapping("/api/foo")
public class FooController {
@PostMapping("/save")
public void postFoo(@Valid @RequestBody Foo foo) {
// do somethings
}
}
這是我的 Foo 類:
public class Foo {
@NotBlank
private String name;
private Integer age;
// getter/setter
}
所以現在我發布一個請求如下:
{
"name": "Foo Name",
"age": "A String"
}
服務器將以狀態回應,400 Bad request沒有任何訊息。我怎樣才能把我的訊息,比如Age must be an integer.
到目前為止,我只有一個將 Age 更改為 String 并添加 @Pattern 驗證注釋的解決方案。
public class Foo {
@NotBlank
private String name;
@Pattern(regexp = "[0-9]*", message = "Age must be an intege")
private String age;
// getter/setter
}
uj5u.com熱心網友回復:
在您的 post 方法簽名中,您可以使用 Response Entity 類來顯示一些要回傳給用戶的例外訊息,以及一些狀態代碼。
uj5u.com熱心網友回復:
您需要實作錯誤處理機制。
在您的錯誤處理程式中,您需要捕獲所有例外并回傳錯誤回應。下面是一個基于 Controller 級別的 ExceptionHandling 的例子
public class FooController{
//...
@ResponseStatus(value=HttpStatus.BAD_REQUEST)
@ExceptionHandler({ CustomException1.class, CustomException2.class })
public ErrorResponse handleException() {
//
}
}
在 ErrorResponse 模型中,您可以根據例外設定錯誤代碼和訊息,通過 ResponseStatus 您可以分配 http 錯誤代碼
然而,他的方法有一個主要缺點:@ExceptionHandler 注釋方法僅對特定控制器有效,而不是對整個應用程式全域有效。
要全域處理例外,您可以使用 ControllerAdvice。 這是一篇關于整體錯誤處理機制的好文章
uj5u.com熱心網友回復:
謝謝大家。我找到了一種添加訊息和回應用戶的方法,可以通過使用ControllerAdvice和覆寫該handleHttpMessageNotReadable方法來了解錯誤,如下例所示:
@ControllerAdvice
public class ErrorHandlerConfig extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers,
HttpStatus status, WebRequest request) {
if (ex.getCause() instanceof InvalidFormatException) {
InvalidFormatException iex = (InvalidFormatException) ex.getCause();
List<Map<String, String>> errors = new ArrayList<>();
iex.getPath().forEach(reference -> {
Map<String, String> error = new HashMap<>();
error.put(reference.getFieldName(), iex.getOriginalMessage());
errors.add(error);
});
return handleExceptionInternal(ex, errors, new HttpHeaders(), apiError.getStatus(), request);
}
return super.handleHttpMessageNotReadable(ex, headers, status, request);
}
}
回應將是:
[
{
"testId": "Cannot deserialize value of type `java.lang.Long` from String \"accm\": not a valid Long value"
}
]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/362866.html
