处理春季靴子中的嵌入式雄猫异常
我们有一个问题,其中嵌入式Tomcat从.它抛出一个 500 HTTP 响应代码。IllegalArgumentException
LegacyCookieProcessor
我们需要处理异常并对它执行一些操作(具体而言,将其作为 400 发送)。
典型的似乎没有被触发,谷歌似乎只给出了处理Spring Boot特定异常的结果。@ExceptionHandler(IllegalArgumentException.class)
例:
下面是重现该行为的示例。您可以通过下载初始项目来执行该示例,包括版本2.1.5.RELEASE中的spring-web(https://start.spring.io/)。然后将以下两个类添加到项目中。
DemoControllerAdvice.java
package com.example.demo;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class DemoControllerAdvice {
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.FORBIDDEN)
public Map<String, String> forbiddenHandler() {
Map<String, String> map = new HashMap<>();
map.put("error", "An error occurred.");
map.put("status", HttpStatus.FORBIDDEN.value() + " " + HttpStatus.FORBIDDEN.name());
return map;
}
}
DemoRestController.java
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoRestController {
@GetMapping(value = "/working")
public void working() {
throw new java.lang.IllegalArgumentException();
}
@GetMapping(value = "/not-working")
public String notWorking(@RequestParam String demo) {
return "You need to pass e.g. the character ^ as a request param to test this.";
}
}
然后,启动服务器并在浏览器中请求以下 URL:
-
http://localhost:8080/working
在控制器中手动抛出 an。然后,它被 ControllerAdvice 捕获,因此将生成一个 JSON 字符串,其中包含IllegalArgumentException
DemoControllerAdvice
-
http://localhost:8080/not-working?demo=test^123
由 Tomcat 引发,因为无法解析请求参数(因为字符无效)。但是,控制器顾问不会捕获异常。它显示了Tomcat提供的默认HTML页面。它还提供了与 中定义的错误代码不同的错误代码。IllegalArgumentException
^
DemoControllerAdvice
在日志中,将显示以下消息:
o.apache.coyote.http11.Http11Processor:解析 HTTP 请求标头时出错 注意:将在 DEBUG 级别记录更多发生的 HTTP 请求解析错误。
java.lang.IllegalArgumentException:在请求目标中找到无效字符。有效字符在 RFC 7230 和 RFC 3986 中定义,地址为 org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:467) ~[tomcat-embed-core-9.0.19.jar:9.0.19]