如何在Spring Boot中禁用ErrorPageFilter?

我正在创建一个应该在Tomcat上运行的SOAP服务。
我正在为我的应用程序使用Spring Boot,类似于:

@Configuration @EnableAutoConfiguration(exclude = ErrorMvcAutoConfiguration.class) public class AppConfig { } 

我的网络服务(例子):

 @Component @WebService public class MyWebservice { @WebMethod @WebResult public String test() { throw new MyException(); } } @WebFault public class MyException extends Exception { } 

问题:
每当我在webservice类中抛出exception时,服务器上都会记录以下消息:

ErrorPageFilter:无法转发请求[/ services / MyWebservice]的错误页面,因为响应已经提交。 因此,响应可能具有错误的状态代码。 如果您的应用程序在WebSphere Application Server上运行,则可以通过将com.ibm.ws.webcontainer.invokeFlushAfterService设置为false来解决此问题

题:
我怎么能阻止这个?

要在Spring Boot中禁用ErrorPageFilter (使用1.3.0.RELEASE测试),请将以下bean添加到Spring配置中:

 @Bean public ErrorPageFilter errorPageFilter() { return new ErrorPageFilter(); } @Bean public FilterRegistrationBean disableSpringBootErrorFilter(ErrorPageFilter filter) { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(filter); filterRegistrationBean.setEnabled(false); return filterRegistrationBean; } 

禁用ErrorPageFilter的最简单方法是:

 @SpringBootApplication public class App extends SpringBootServletInitializer { public App() { super(); setRegisterErrorPageFilter(false); // <- this one } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(App.class); } public static void main(String[] args) { SpringApplication.run(App.class, args); } 
  @SpringBootApplication public class MyApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { //set register error pagefilter false setRegisterErrorPageFilter(false); builder.sources(MyApplication.class); return builder; } } 

我在源代码中发现ErrorPageFilter.java具有以下代码:

 private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { ErrorWrapperResponse wrapped = new ErrorWrapperResponse(response); try { chain.doFilter(request, wrapped); int status = wrapped.getStatus(); if (status >= 400) { handleErrorStatus(request, response, status, wrapped.getMessage()); response.flushBuffer(); } else if (!request.isAsyncStarted() && !response.isCommitted()) { response.flushBuffer(); } } catch (Throwable ex) { handleException(request, response, wrapped, ex); response.flushBuffer(); } } 

正如您所看到的,当您抛出exception并返回响应代码> = 400时,它将执行一些代码。 如果响应已经提交,应该进行一些额外的检查。

删除ErrorPageFilter的方法是这样的

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

克里斯

 public class Application extends SpringBootServletInitializer { private static final Logger logger = LogManager.getLogger(Application.class); public Application() { super(); setRegisterErrorPageFilter(false); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } }