【发布时间】:2020-07-06 04:06:56
【问题描述】:
我正在开发 Spring Boot 2.0.3
我正在尝试解析一个简单的 JSON 有效负载,如下所示
{
"title": "Test Title",
"description": "Test Desc"
}
带有验证的模型 (kotlin)
data class SimpleObject(
@NotNull
@JsonProperty("title")
val title: String,
@JsonProperty("description")
val description: String
)
我在controller 中的方法如下所示
@PostMapping(value = "/${api.version}/path")
public ResponseEntity postLandingData(final @RequestParam("param1") String kruxSegments,
final @RequestHeader(
value = "Some-Id",
required = false) List<String> profileIdList,
final @RequestBody(required = false) @Valid SimpleObject simpleObject) {
//code related to getting response
}
- 当我创建具有有效请求正文的请求时,我可以看到 JSON 有效负载已正确处理
- 当我使用格式错误的 JSON 有效负载创建请求时,如下所示(请注意缺少必填字段)
{
"description": "Test Desc"
}
IllegalArgumentException 被抛出
我尝试在Controller 中使用ExceptionHandler 捕获此异常,如下所示,但这不起作用
@ExceptionHandler(IllegalArgumentException.class)
public void handleException() {
LOG.severe("------------------ILLEGAL-----------------");
}
注意:以下依赖被添加到 build.gradle
classpath "org.springframework.boot:spring-boot-starter-validation:2.3.1.RELEASE"
另请注意:是的,它是 javaa + kotlin 代码库:)
我的问题是
- 根据我阅读的内容,在这种情况下不应该抛出
MethodArgumentNotValidException - 为什么@ExceptionHandler 不能捕获
IllegalArgumentException?
谢谢
【问题讨论】:
-
ExceptionHandler 不起作用,因为它被设计为处理来自控制器方法调用的异常。在您的情况下,IllegalArgumentException 是由 spring mvc 框架本身引发的,因此执行甚至还没有到达您的控制器,因此 ExceptionHandler 甚至不会出现。您可以从 IllegalArgumentException 的完整堆栈跟踪中确认这一点。
-
您能否分享 IllegalArgumentException 的完整堆栈跟踪,这肯定有助于回答您的第一个问题“不应该抛出 MethodArgumentNotValidException”
-
检查这是否有帮助。 stackoverflow.com/questions/62054406/…