Мое приложение настроено следующим образом:
- Spring Boot 2.0.1.RELEASE
- Tomcat 8.5
- Развернуто как WAR
- Spring MVC
Я столкнулся с проблемой с BasicErrorController.Я пробовал несколько методов:
- Нет изменений в методах обработки ошибок, которые должны привести к появлению страницы ошибки по умолчанию с белой меткой.Это работает, как и ожидалось, для 404 ошибок, но не для 500 ошибок.Полученная страница является страницей ошибок Tomcat по умолчанию.
- Настройте 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);
}
}