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.
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. –
Ho aggiunto anche questo file alla descrizione ora per evitare confusione. Ti sei distribuito su un tomcat 8? – MrC
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 –