java - Spring Boot 中多个项目中的错误处理程序
问题描述
我目前正在使用 Spring Boot 中不同项目中的不同服务。
我已经制作了一个错误处理程序,它将成为所有项目的 JAR,所以当我有
com.my.package
在所有项目中,错误处理程序都可以正常工作。
com.my.package.Controller
com.my.package.Entity
...
我的异常响应:
"code": 400,
"message": "'id' must be java.lang.Integer",
"status": "BAD_REQUEST"
}
但问题是当我有
com.my.package.p1
-> 对于项目 p1
com.my.package.p2
-> 对于项目 p2
com.my.package.p1.Controller
com.my.package.p1.Entity
...
com.my.package.p2.Controller
com.my.package.p2.Entity
...
错误处理程序似乎在其工作中失败,并且默认处理程序解决了错误,而不是我的。
{
"timestamp": "2019-09-30T23:58:57.379+0000",
"status": 400,
"error": "Bad Request",
"message": "Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; nested exception is java.lang.NumberFormatException: For input string: \"j\"",
"path": "/api/department/j"
}
这些是我的 JAR 中的课程
//@RestControllerAdvice(basePackages = "com.my.package")
@ControllerAdvice
public class GlobalControllerExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
//405
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
protected GlobalException processMethodNotSupportedException(final HttpRequestMethodNotSupportedException ex) {
LOGGER.error("Method not allowed");
return new GlobalException(405, "Method not allowed",HttpStatus.METHOD_NOT_ALLOWED);
}
...
如您所见,我尝试使用@RestControllerAdvice 和@ControllerAdvice,并尝试使用注释basePackages但没有成功的结果。
我还上了另一堂课:
@Configuration
@ComponentScan("com.my.package")
@EntityScan("com.my.package")
public class SharedBeanReference {
}
但同样的结果。
有人可以帮我弄清楚发生了什么吗?
解决方案
您可以尝试使用以下注释指定控制器建议的基本包:
@ControllerAdvice(basePackages = "com.my.package")
public class GlobalControllerExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
//405
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
protected GlobalException processMethodNotSupportedException(final HttpRequestMethodNotSupportedException ex) {
LOGGER.error("Method not allowed");
return new GlobalException(405, "Method not allowed",HttpStatus.METHOD_NOT_ALLOWED);
}
...
对于 @ExceptionHandler 方法,在特定通知 bean 的处理程序方法中,根异常匹配将优于仅匹配当前异常的原因。但是,高优先级通知上的原因匹配仍将优先于低优先级通知 bean 上的任何匹配(无论是根级别还是原因级别)。因此,请在具有相应顺序的优先通知 bean 上声明您的主根异常映射。
或者您可以尝试以下方法:
@Priority
尝试使用or注释为控制器建议类提供更高的优先级或顺序@Order
,以使其匹配。- 您需要确保
@ControllerAdvice
该类在您的组件扫描基础包下。
推荐阅读
- sql - 仅从感兴趣的表中选择
- struct - 有没有办法让递归结构/枚举默认装箱?
- for-loop - 来自命令的批量变量存储结果
- c++ - 没有执行策略的 std::transform_reduce 是否可移植?
- python - Keras 上的自定义损失函数给出了一个奇怪的错误:__call__() 缺少 1 个必需的位置参数:'y_true'
- python - 图片更新后显示空白
- java - 找不到要发送 Tab 键的 HTML 元素
- ios - WatchOS 应用程序未检测到配套的 iOS 应用程序
- user-interface - Roblox Gui 仅在第一次单击时打开/关闭
- github - 当我在推送到所有常规存储库时尝试推送到 gist.github.com 时,是什么导致了这个错误?