尝试处理 Spring Boot 应用程序中的异常时,日志中出现 ErrorPageFilter 错误

Posted

技术标签:

【中文标题】尝试处理 Spring Boot 应用程序中的异常时,日志中出现 ErrorPageFilter 错误【英文标题】:ErrorPageFilter error in log when trying to handle exception in a Spring Boot app 【发布时间】:2015-06-15 08:01:36 【问题描述】:

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

Tomcat 8(独立) Spring Boot 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;

我的 Spring Boot 应用程序设置:

@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);


pom.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。但是,我确实在日志中看到了 ErrorPageFilter 错误:

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

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

任何有关此问题的帮助/提示将不胜感激,因为我已经陷入了问题可能是什么。

【问题讨论】:

您能解释一下当您不使用SpringBootServletInitializer 时如何为外部Tomcat 使用war 打包? docs.spring.io/spring-boot/docs/1.2.3.RELEASE/reference/…我有点困惑。否则,我已经使用您提供的内容构建了一个演示项目并从 STS 运行它,我无法重现错误消息。 我现在也将该文件添加到描述中,以避免混淆。你是在 tomcat 8 上部署的吗? 您可能对this Spring Boot issue 感兴趣。你的应用程序没有做错任何事情;这是Boot错误页面过滤器的限制 非常感谢!问题似乎确实相似,应用类似的解决方法也为我删除了日志中的错误。 【参考方案1】:

如果您仍然使用 Spring-boot 版本 1.2.3(不是 1.4.2.RELEASE where solution provided),则扩展 SpringBootServletInitializer 并覆盖方法 run,如下所示:

@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

【讨论】:

以上是关于尝试处理 Spring Boot 应用程序中的异常时,日志中出现 ErrorPageFilter 错误的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + 调度程序 + Spring Data JPA + Oracle 中的异常处理

如何使用 Spring Boot 对 WebFlux 进行异常处理?

在春季批处理(spring-boot-1.5.2.RELEASE)中使用多个数据源在启动时引发异常

处理RabbitMQ Spring Boot应用程序中的异常

Spring Boot异常处理

Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理