错误页面尝试处理Spring Boot应用程序中的异常时日志中的过滤器错误

我已经制作了一个小的Spring Boot应用程序,现在我正在尝试添加自己的异常处理。我遇到了一个问题,即使应用程序按预期工作,我也会在日志中收到错误。配置:

  • 雄猫8(独立)
  • 弹簧启动版本 1.2.3
  • 战争包装


异常处理程序如下所示:

@ControllerAdvice
public class GlobalExceptionHandler {

@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(NotFoundException.class)
@ResponseBody ErrorInfo handleNotFoundRequest(HttpServletRequest req, Exception ex) {
    return new ErrorInfo(req.getRequestURL().toString(), ex);
}

}

引发异常的我的控制器:

@RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = {"application/json"})
public @ResponseBody
HashMap environment(@PathVariable("id") long id)  {
    HashMap<String, Object> map = new HashMap();
    Environment env = environmentService.getEnvironment(id);

    if(env == null) throw new NotFoundException("Environment not found: " + id);

    map.put("environment", env);

    return map;
}

我的弹簧启动应用程序设置:

@SpringBootApplication
@EnableAutoConfiguration(exclude=ErrorMvcAutoConfiguration.class)
@ComponentScan
public class QaApiApplication {

public static void main(String[] args) {
    SpringApplication.run(QaApiApplication.class, args);
}
}

ServletInitializer:

public class ServletInitializer extends SpringBootServletInitializer {

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder   application) {
    return application.sources(QaApiApplication.class);
}
}

啪.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
......
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jersey</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>


如果我执行生成异常的调用,我会得到正确的响应,即具有预期 JSON 的 404。但是,我在日志中看到一个错误页面过滤器错误:

2015-04-09 21:05:38.647 错误 85940 --- [io-8080-exec-16] o.s.boot.context.web.ErrorPageFilter:无法转发到请求 [/environments/1] 的错误页面,因为响应已提交。因此,响应可能具有错误的状态代码。如果您的应用程序在 WebSphere Application Server 上运行,则可以通过将 com.ibm.ws.webcontainer.invokeFlushAfterService 设置为 false 来解决此问题。


启动/部署时没有错误,据我所知,一切似乎都在工作。我怀疑有一些默认行为我没有正确覆盖,但我还没有弄清楚到底是什么。

任何帮助/提示将不胜感激,因为我已经陷入了问题所在。


答案 1

如果您仍然使用Spring-boot版本1.2.3(而不是提供解决方案的1.4.2.RELEASE),则扩展和覆盖方法如下:SpringBootServletInitializerrun

@SpringBootApplication
@EnableAutoConfiguration(exclude=ErrorMvcAutoConfiguration.class)
@ComponentScan
public class QaApiApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
         SpringApplication.run(QaApiApplication.class, args);
    }

    @Override
    protected WebApplicationContext run(SpringApplication application) {
        application.getSources().remove(ErrorPageFilter.class);
        return super.run(application);
    }
}

它对我有用。


答案 2

我最终遇到了在WAS Liberty配置文件上运行的Springboot2.0应用程序的同一问题。我已经在属性文件中使用以下配置禁用了错误页过滤。logging.level.org.springframework.boot.context.web.ErrorPageFilter=off


推荐