2015-04-09 9 views
13

Ho creato una piccola applicazione Spring Boot e ora sto cercando di aggiungere la mia gestione delle eccezioni. Sto riscontrando un problema in cui viene visualizzato un errore nel registro anche se l'app funziona come previsto. La configurazione:Errore ErrorPageFilter nel registro quando si tenta di gestire l'eccezione in un'app di Spring Boot

  • Tomcat 8 (stand-alone) versione
  • Primavera Boot 1.2.3
  • imballaggio Guerra


Il gestore di eccezioni si presenta come segue:

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

} 

Il mio controller che genera l'eccezione:

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

La mia Primavera di avvio l'installazione dell'applicazione:

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


Se faccio una chiamata che genera l'eccezione ottengo la risposta corretta, un 404 con il JSON atteso. Io però vedo un errore di ErrorPageFilter nel registro:

2015-04-09 21: 05: 38,647 ERRORE 85940 --- [io-8080-exec-16] osboot.context.web .ErrorPageFilter: impossibile inoltrare alla pagina di errore per richiesta [/ ambienti/1] poiché la risposta è già stata commessa . Di conseguenza, la risposta potrebbe avere il codice di stato errato. Se l'applicazione è in esecuzione su WebSphere Application Server si può essere in grado di risolvere questo problema impostando com.ibm.ws.webcontainer.invokeFlushAfterService false


non c'è nessun errore all'avvio/deployment e tutto sembra funzionare per quanto posso vedere. Sospetto che ci sia un comportamento predefinito che non ho sovrascritto correttamente o così, ma devo ancora capire esattamente cosa.

Qualsiasi aiuto/consiglio su questo sarebbe molto apprezzato in quanto sono rimasto bloccato su quale potrebbe essere il problema.

+0

Puoi spiegare come stai usando la confezione di guerra per un Tomcat esterno quando non stai usando 'SpringBootServletInitializer'? http: //docs.spring.io/spring-boot/docs/1.2.3.RELEASE/reference/htmlsingle/# howto-create-a-deployable-war-file Sono un po 'confuso. Altrimenti, ho creato un progetto demo con quello che hai fornito ed eseguito da STS, e non riesco a riprodurre il messaggio di errore. –

+0

Ho aggiunto anche questo file alla descrizione ora per evitare confusione. Ti sei distribuito su un tomcat 8? – MrC

+4

Potrebbe interessarti [questo problema Spring Boot] (https://github.com/spring-projects/spring-boot/issues/2745). Non stai facendo nulla di sbagliato nella tua applicazione; è una limitazione del filtro della pagina degli errori di Boot –

risposta

0

Se si utilizza ancora Primavera-boot versione 1.2.3 (non 1.4.2.RELEASE dove solution provided) quindi estendere SpringBootServletInitializer e di esclusione metodo run come segue:

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

funziona per me.