gpt4 book ai didi

java - 有没有办法获取上下文中可用的异常处理程序类/方法的列表?

转载 作者:行者123 更新时间:2023-12-02 01:54:17 29 4
gpt4 key购买 nike

我正在开发 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com