如何在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); } }