【问题标题】:ServletRegistrationBean and ControllerAdvice conflict in Spring bootSpring boot 中的 ServletRegistrationBean 和 ControllerAdvice 冲突
【发布时间】:2017-11-07 10:23:17
【问题描述】:

我正在使用 Spring Boot 1.5.7。 我有一个配置类DispatcherServletCustomConfigurationServletRegistrationBean

ServletRegistrationBean registration = new ServletRegistrationBean(
               dispatcherServlet(), "/api/*");

在项目中存在另一个带有注释 @ControllerAdvice 的类,带有 404 和错误处理程序。控制器建议不起作用。 如果我禁用 DispatcherServletCustomConfiguration 控制器建议正常工作。 你能帮我吗?再见。

更新:

控制器建议:

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    private final Logger log = LoggerFactory.getLogger(this.getClass());

    @Override
    protected ResponseEntity<Object> handleNoHandlerFoundException(NoHandlerFoundException ex, HttpHeaders headers,
            HttpStatus status, WebRequest request) {
        GenericResponse response = new GenericResponse();
        response.getStatus().setCodice(EsitiMapping.NOT_FOUND.getEsito());
        response.getStatus().setDescrizione(EsitiMapping.NOT_FOUND.getDescrizioneEsito());
        response.getStatus().setCodice(EsitiMapping.NOT_FOUND.getCodice());
        //log.error(ex.getMessage(), ex);
        return handleExceptionInternal(ex, response, new HttpHeaders(), HttpStatus.NOT_FOUND, request);
    }

    @ExceptionHandler(value = { Exception.class })
    protected ResponseEntity<Object> handleGenericError(RuntimeException ex, WebRequest request) {
        GenericResponse response = new GenericResponse();
        response.getStatus().setCodice(EsitiMapping.INTERNAL_ERROR.getEsito());
        response.getStatus().setDescrizione(EsitiMapping.INTERNAL_ERROR.getDescrizioneEsito());
        response.getStatus().setCodice(EsitiMapping.INTERNAL_ERROR.getCodice());
        log.error(ex.getMessage(), ex);
        return handleExceptionInternal(ex, response, new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR, request);
    }

}

Servlet 注册 Bean:

@Configuration
public class DispatcherServletCustomConfiguration {

    @Bean
    public DispatcherServlet dispatcherServlet() {
        return new DispatcherServlet();
    }

    @Bean
    public ServletRegistrationBean dispatcherServletRegistration() {
        ServletRegistrationBean registration = new ServletRegistrationBean(
                dispatcherServlet(), "/api/*");
        registration.setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);
        return registration;
    }
}

【问题讨论】:

  • 请粘贴您的完整配置。
  • @AtaurRahmanMunna 我更新了帖子。谢谢
  • 你有没有扩展WebApplicationInitializer的类?如果有,请粘贴该配置。
  • 我有一个简单的@SpringBootApplication 应用程序类。
  • 请用@EnableWebMvc注释你的RestResponseEntityExceptionHandler类并让我知道状态。

标签: java spring spring-mvc servlets spring-boot


【解决方案1】:

我找到了解决办法:

@Bean
public ServletRegistrationBean dispatcherServletRegistration() {
    ServletRegistrationBean registration = new ServletRegistrationBean(
            dispatcherServlet(), "/api/*");
    dispatcherServlet().setThrowExceptionIfNoHandlerFound(true);
    registration.setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);
    return registration;
}

我设置dispatcherServlet().setThrowExceptionIfNoHandlerFound(true); 来处理未找到错误的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2016-12-29
    • 2020-06-05
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多