membersound
membersound

Reputation: 86845

How to disable ErrorPageFilter in Spring Boot?

I'm creating a SOAP service that should be running on Tomcat.
I'm using Spring Boot for my application, similar to:

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


My webservice (example):

@Component
@WebService
public class MyWebservice {

    @WebMethod
    @WebResult
    public String test() {
        throw new MyException();
    }
}

@WebFault
public class MyException extends Exception {
}


Problem:
Whenever I throw an exception within the webservice class, the following message is logged on the server:

ErrorPageFilter: Cannot forward to error page for request [/services/MyWebservice] as the response has already been committed. As a result, the response may have the wrong status code. If your application is running on WebSphere Application Server you may be able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false


Question:
How can I prevent this?

Upvotes: 24

Views: 83879

Answers (6)

Madhu Stv
Madhu Stv

Reputation: 89

The best way is to tell the WebSphere container to stop ErrorPageFiltering. To achieve this we have to define a property in the server.xml file.

<webContainer throwExceptionWhenUnableToCompleteOrDispatch="false" invokeFlushAfterService="false"></webContainer>

Alternatively, you also can disable it in the spring application.properties file

logging.level.org.springframework.boot.context.web.ErrorPageFilter=off

I prefer the first way.Hope this helps.

Upvotes: 5

Christopher Rivera
Christopher Rivera

Reputation: 420

I found in the sources that the ErrorPageFilter.java has the following code:

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();
    }
}

As you can see when you throw an exception and return a response code >= 400 it will do some code. there should be some additional check if the response was already committed or not.

The way to remove the ErrorPageFilter is like this

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

Chris

Upvotes: 3

manish negi
manish negi

Reputation: 29

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

Upvotes: -3

jimlgx
jimlgx

Reputation: 129

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

}

Upvotes: 11

Trynkiewicz Mariusz
Trynkiewicz Mariusz

Reputation: 2782

The simpliest way to disable ErrorPageFilter is:

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

Upvotes: 20

mzc
mzc

Reputation: 3355

To disable the ErrorPageFilter in Spring Boot (tested with 1.3.0.RELEASE), add the following beans to your Spring configuration:

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

Upvotes: 27

Related Questions