Java ErrorPageFilter与ResponseEntityExceptionHandler冲突
由于我希望控制应用程序所有端点(包括未明确定义的端点)的输出,我创建了一个简单的Java ErrorPageFilter与ResponseEntityExceptionHandler冲突,java,spring,spring-mvc,spring-boot,Java,Spring,Spring Mvc,Spring Boot,由于我希望控制应用程序所有端点(包括未明确定义的端点)的输出,我创建了一个简单的DefaultController,如下所示 @RestController public class DefaultController { @RequestMapping("/**") public void unmappedRequest(HttpServletRequest request) { throw new ResourceNotFoundException();
DefaultController
,如下所示
@RestController
public class DefaultController {
@RequestMapping("/**")
public void unmappedRequest(HttpServletRequest request) {
throw new ResourceNotFoundException();
}
}
我还有一个@ControllerAdvice
错误控制器,它扩展了ResponseEntityExceptionHandler
,并重写该类中的所有方法,特别是
@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
if(HttpStatus.INTERNAL_SERVER_ERROR.equals(status)) {
request.setAttribute("javax.servlet.error.exception", ex, 0);
}
SearchOutput output = new SearchOutput(body);
return new ResponseEntity<>(output, headers, status);
}
我声明了error.whitelabel.enabled:false
并将exclude={ErrorMvcAutoConfiguration.class}
添加到@EnableAutoConfiguration
注释中,在独立的Tomcat容器中运行此应用程序时仍然存在两个问题:
抱怨每次抛出ErrorPageFilter
时,由于响应已经提交,它无法转发到请求的错误页面[/something/not/existing]李>ResourceNotFoundException
- 当浏览器(自动)请求
时,favicon.ico
记录了调用@ExceptionHandler方法失败
方法的错误,说明handleExceptionInternal
找不到可接受的表示形式
另外-这是处理不存在的资源的一种可接受的方法吗?处理这种情况的最简单方法是只定义错误页面映射并拥有一个错误控制器(我更喜欢基于HTTP代码映射-更容易映射404代码,而不是抛出特定的异常)-此链接显示如何在Spring Boot中定义错误页映射。
@ExceptionHandler(ResourceNotFoundException.class)
public @ResponseBody ResponseEntity<Object> handleResourceNotFound(ResourceNotFoundException ex, WebRequest request) {
HttpHeaders headers = new HttpHeaders();
HttpStatus status = HttpStatus.NOT_FOUND;
ErrorOutput out = new ErrorOutput("Resource not found", status);
return this.handleExceptionInternal(ex, out, headers, status, request);
}