2015-05-11 11 views
15

Sto creando un servizio SOAP che dovrebbe essere in esecuzione su Tomcat.
Sto usando Primavera di avvio per la mia applicazione, simile a:Come disabilitare ErrorPageFilter in Spring Boot?

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


mio webservice (esempio):

@Component 
@WebService 
public class MyWebservice { 

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

@WebFault 
public class MyException extends Exception { 
} 


Problema:
Ogni volta che un'eccezione all'interno della classe webservice, sul server viene registrato il seguente messaggio:

ErrorPageFilter: impossibile inoltrare alla pagina di errore per richiesta [/ services/MyWebservice] poiché la risposta è già stata confermata. Di conseguenza, la risposta potrebbe avere il codice di stato errato. Se l'applicazione è in esecuzione su WebSphere Application Server può essere possibile a risolvere questo problema impostando com.ibm.ws.webcontainer.invokeFlushAfterService false


Domanda:
Come posso prevenire questo?

+0

Puoi condividere un po 'di codice che riproduce il problema? –

risposta

18

Per disattivare il ErrorPageFilter nella primavera del Boot (testato con 1.3.0.RELEASE), aggiungere le seguenti fagioli alla configurazione primavera :

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

Stavi usando un contenitore incorporato per questo? O uno spiegamento di guerra? – Dan

3

ho trovato nelle fonti che il ErrorPageFilter.java ha il seguente codice:

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

Come si può vedere quando si lancia un'eccezione e restituire un codice di risposta> = 400 sarà fare un po 'di codice. ci dovrebbe essere qualche controllo aggiuntivo se la risposta è stata già commessa o meno.

Il modo per rimuovere l'ErrorPageFilter è come questo

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

Chris

9

Il modo più semplice per disattivare 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); 
} 
+1

Questo sembra essere il modo ufficiale per farlo, secondo il bug report in GitHub. Questa è la correzione che hanno aggiunto: https://github.com/spring-projects/spring-boot/commit/11d59df3fd71a656a7869ace4303a8d72e6f777c – Calabacin

+0

Questa soluzione non funziona da Spring Boot 1.5.0. –

+0

@ Sõber è probabilmente un bug, in quanto è possibile vedere nulla è cambiato qui https://github.com/spring-projects/spring-boot/blame/11d59df3fd71a656a7869ace4303a8d72e6f777c/spring-boot/src/main/java/org/springframework/ boot/context/web/SpringBootServletInitializer.java –

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

} 
-2
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); 
    } 
} 
+0

Come questo risolve il problema? –

+1

Si prega di dare un'occhiata a: [Come scrivere una buona risposta] (http://stackoverflow.com/help/how-to-answer) – Linuslabo