Подтвердить что ты не робот

Ошибка ErrorPageFilter в журнале при попытке обработать исключение в приложении Spring Boot

Я сделал небольшое приложение загрузки Spring, и теперь я пытаюсь добавить свою собственную обработку исключений. У меня возникла проблема, когда я получаю сообщение об ошибке в журнале, хотя приложение работает так, как ожидалось. Конфигурация:

  • Tomcat 8 (автономный)
  • Spring Загрузочная версия 1.2.3
  • Военная упаковка


Обработчик исключений выглядит следующим образом:

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

}

Мой контроллер, который генерирует исключение:

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

My Spring Настройка загрузочного приложения:

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


Если я делаю вызов, который генерирует исключение, я получаю правильный ответ, 404 с ожидаемым JSON. Однако я вижу ошибку ErrorPageFilter в журнале:

2015-04-09 21: 05: 38.647 ОШИБКА 85940 --- [io-8080-exec-16] o.s.boot.context.web.ErrorPageFilter: не удается переслать ошибку страницы для запроса [/environment/1], поскольку ответ уже совершено. В результате ответ может иметь неправильный код состояния. Если ваше приложение работает на WebSphere Application Server, вы можете уметь решить эту проблему, установив com.ibm.ws.webcontainer.invokeFlushAfterService - false


Ошибок при запуске/развертывании нет, и все, кажется, работает, насколько я вижу. Я подозреваю, что есть некоторые по умолчанию поведение, которое я не переопределил правильно или так, но я еще не понял, что именно.

Любая помощь/подсказка вокруг этого будет очень признательна, поскольку я застрял в том, что проблема может быть.

4b9b3361

Ответ 1

Если вы все еще используете Spring -boot версию 1.2.3 (не 1.4.2.RELEASE, где решение предоставлено), затем продолжите SpringBootServletInitializer и переопределить метод run следующим образом:

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

Это работает для меня.