- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发 Rest API。目前,我正在尝试处理一些错误的客户端输入。到目前为止一切顺利,我已经将它与 java 验证一起使用了。
在特定情况下,我可能会遇到奇怪的客户输入日期。这是一个 mvce:
public class Input {
@NotNull(message = "Usage to should have a valid date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime someDateTime;
//getters and setters
}
public class Output {
//content not relevant for the case...
}
@RestController
public class FooController {
@PostMapping(path="/url", consumes = APPLICATION_JSON_UTF8_VALUE, produces = APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<Output> foo(@Valid @ResponseBody Input input) {
//implementation details...
}
}
测试时,此输入工作正常:
{
"someDateTime": "2019-01-01 00:00:00"
}
这不是(时间缺失):
{
"someDateTime": "2019-01-01"
}
对于最新的输入示例,我得到一个 HttpMessageNotReadableException
(来自 Spring)。
我试图通过在全局异常处理程序中添加一个方法来解决这个问题:
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<ErrorResponse> customSpringInputHandler(
HttpMessageNotReadableException e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(new ErrorResponse(CLIENT_INPUT_EXCEPTION, e.getMessage()));
}
}
有了这个,现在我得到了更详细的异常消息。遗憾的是,此消息过于冗长,无法返回到此 API 的客户端,因为它描述了应用程序的一些内部设计。
我可以看到这个 HttpMessageNotReadableException
包装了一个 InvalidFormatException
(来自 Jackson),它更适合我使用。问题是,在单个方法中处理 HttpMessageNotReadableException 的特定情况似乎有点可疑。我正在考虑为 InvalidFormatException 创建一个特定的异常处理程序,然后从此方法委托(delegate)执行。现在我想知道 Spring 如何为我提供这些处理程序并进行适当的委托(delegate)。
我过去在 JAX-RS 中内置了一些东西,就像这样:
@SuppressWarnings("unchecked")
protected <T extends Throwable> Response callChainedMapper(T wrappedException, Exception baseException) {
Response response;
ExceptionMapper<T> mapper = (ExceptionMapper<T>) providers.getExceptionMapper(wrappedException.getClass());
//no mapper could be found, so treat it as a generic exception
if (mapper == null) {
ExceptionMapper<Exception> generalExceptionMapper = (ExceptionMapper<Exception>) providers
.getExceptionMapper(Exception.class);
response = generalExceptionMapper.toResponse(baseException);
} else {
response = mapper.toResponse(wrappedException);
}
return response;
}
我可以在 Spring 中做类似的事情吗?或者也许还有其他选择?
最佳答案
不知道 Spring 为此类委托(delegate)提供了特定功能。但你可以简单地按照以下模式自己做。 Spring提供的ResponseEntityExceptionHandler
也使用这种模式。
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({
HttpMessageNotReadableException.class ,
InvalidFormatException.class})
public ResponseEntity<ErrorResponse> customSpringInputHandler(Exception ex) {
if(ex instanceof HttpMessageNotReadableException){
return handle((HttpMessageNotReadableException) ex);
}else if(ex instance of InvalidFormatException) {
return handle((InvalidFormatException) ex);
}else{
throw ex;
}
}
private ResponseEntity<ErrorResponse> handle(HttpMessageNotReadableException ex){
//get the wrapped InvalidFormatException and call handle(invalidFormatException)
}
private ResponseEntity<ErrorResponse> handle(InvalidFormatException ex){
}
}
关于java - 有没有办法获取上下文中可用的异常处理程序类/方法的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57408063/
我是一名优秀的程序员,十分优秀!