Развертывание войны Spring Boot с Tomcat8 и ErrorPageFilter - PullRequest
0 голосов
/ 24 апреля 2018

Мое приложение настроено следующим образом:

  • Spring Boot 2.0.1.RELEASE
  • Tomcat 8.5
  • Развернуто как WAR
  • Spring MVC

Я столкнулся с проблемой с BasicErrorController.Я пробовал несколько методов:

  1. Нет изменений в методах обработки ошибок, которые должны привести к появлению страницы ошибки по умолчанию с белой меткой.Это работает, как и ожидалось, для 404 ошибок, но не для 500 ошибок.Полученная страница является страницей ошибок Tomcat по умолчанию.
  2. Настройте ErrorViewResolver, как показано ниже.Это также исправлено для 404 ошибок, как и ожидалось.Для 500 кодов состояния это разрешается аналогично приведенному выше, где Tomcat отображает страницу ошибки по умолчанию.

@ Component

public class CustomErrorViewResolver implements ErrorViewResolver {

    private Log logger = LogFactory.getLog(getClass());

    @Override
    public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
        if (HttpStatus.NOT_FOUND == status) {
                logger.error("Error 404 for url " + model.get("path"));
            return new ModelAndView("errors/page-not-found", model);
        }
        else if (HttpStatus.INTERNAL_SERVER_ERROR == status) {
            return new ModelAndView("errors/server-error", model);
        }

        return new ModelAndView("errors/server-error", model);
    }

}

При рассмотрении ErrorPageFilter это может бытьиз-за response.sendError (..), заставляющего Tomcat обработать ошибку?Этот фрагмент не используется во время вызова 404, так как он относится к обработке исключений.Я также не вижу этого в основной ветке Spring Boot для ErrorPageFilter.

private void forwardToErrorPage(String path, HttpServletRequest request,
            HttpServletResponse response, Throwable ex)
            throws ServletException, IOException {
        if (logger.isErrorEnabled()) {
            String message = "Forwarding to error page from request "
                    + getDescription(request) + " due to exception [" + ex.getMessage()
                    + "]";
            logger.error(message, ex);
        }
        setErrorAttributes(request, 500, ex.getMessage());
        request.setAttribute(ERROR_EXCEPTION, ex);
        request.setAttribute(ERROR_EXCEPTION_TYPE, ex.getClass());
        response.reset();
        response.sendError(500, ex.getMessage());
        request.getRequestDispatcher(path).forward(request, response);
        request.removeAttribute(ERROR_EXCEPTION);
        request.removeAttribute(ERROR_EXCEPTION_TYPE);
    }

Есть ли потенциальная проблема с Spring boot 2.0.1?Или я должен перейти на другую версию?Я пропускаю отдельную конфигурацию?Любые мысли были бы замечательно, спасибо.

** Редактирование, добавление класса приложения и конфигурации **

@Configuration
@ImportResource({"classpath:spring/ibatisContext.xml", "classpath:spring/daoContext-latam.xml"})
@SpringBootApplication
@EnableScheduling
@ComponentScan(basePackages = { ...},
        excludeFilters = { ... }
        )
public class LatApplication extends SpringBootServletInitializer{

    public static void main(String[] args) {
        SpringApplication.run(LatApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(LatApplication.class);
    }
}

Класс конфигурации MVC:

@Configuration
public class MvcConfiguration implements WebMvcConfigurer {

    @Autowired
    CustomStringToArrayConverter stringToArrayConverter;

    @Autowired
    InterceptorController businessTypeInterceptor;

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        registry.viewResolver(resolver);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
    }

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new CustomStringToArrayConverter());
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(true);
        configurer.setUseTrailingSlashMatch(false);
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(businessTypeInterceptor);
    }

}
...