ais*_*siy 5 java exception-handling spring-mvc jackson spring-boot
我知道这里有一些关于如何解析 ENUM、如何解析自定义 JSON 结构的类似问题。但在这里我的问题是,当用户提交一些 JSON 时,如何提供更好的信息而不是预期的。
这是代码:
@PutMapping
public ResponseEntity updateLimitations(@PathVariable("userId") String userId,
@RequestBody LimitationParams params) {
Limitations limitations = user.getLimitations();
params.getDatasets().forEach(limitations::updateDatasetLimitation);
params.getResources().forEach(limitations::updateResourceLimitation);
userRepository.save(user);
return ResponseEntity.noContent().build();
}
Run Code Online (Sandbox Code Playgroud)
我期望的请求正文是这样的:
{
"datasets": {"public": 10},
"resources": {"cpu": 2}
}
Run Code Online (Sandbox Code Playgroud)
但是当他们提交这样的东西时:
{
"datasets": {"public": "str"}, // <--- a string is given
"resources": {"cpu": 2}
}
Run Code Online (Sandbox Code Playgroud)
响应将在日志中显示如下内容:
400 JSON parse error: Cannot deserialize value of type `java.lang.Integer` from String "invalid": not a valid Integer value; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.lang.Integer` from String "invalid": not a valid Integer value
Run Code Online (Sandbox Code Playgroud)
在 [来源: (PushbackInputStream); 行:1,列:23](通过参考链:com.openbayes.api.users.LimitationParams["datasets"]->java.util.LinkedHashMap["public"])
但我想要的是更易读的信息。
我尝试使用ExceptionHandlerforcom.fasterxml.jackson.databind.exc.InvalidFormatException但它不起作用。
您可以编写控制器建议来捕获异常并返回相应的错误响应。
这是 Spring Boot 中控制器建议的示例:
@RestControllerAdvice
public class ControllerAdvice {
@ExceptionHandler(InvalidFormatException.class)
public ResponseEntity<ErrorResponse> invalidFormatException(final InvalidFormatException e) {
return error(e, HttpStatus.BAD_REQUEST);
}
private ResponseEntity <ErrorResponse> error(final Exception exception, final HttpStatus httpStatus) {
final String message = Optional.ofNullable(exception.getMessage()).orElse(exception.getClass().getSimpleName());
return new ResponseEntity(new ErrorResponse(message), httpStatus);
}
}
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ErrorResponse {
private String errorMessage;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5493 次 |
| 最近记录: |