Spring:没有从错误页面

时间:2016-03-10 21:55:54

标签: java spring spring-mvc spring-boot

我有一个Spring Boot Web应用程序,它使用addResourceHandlers WebMvcConfigurerAdapter方法为静态资源(主要是CSS和JS文件)添加资源处理程序。此资源处理程序进一步配置为启用VersionResourceResolver基本上这是

public class CustomWebMvcConfigurer extends WebMvcConfigurerAdapter {
    ...
    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        ResourceHandlerRegistration registration = registry.addResourceHandler(...)
        ResourceChainRegistration chainRegistration = registration.resourceChain(...);
        chainRegistration.addResolver(
            new VersionResourceResolver().addContentVersionStrategy(...));
        ...
    }
} 

现在的问题是,当用户看到错误页面(例如404页面)时,将不会使用此VersionResourceResolver。 (错误页面使用@ExceptionHandler带注释的类中的@ControllerAdvice进行配置。)错误页面将呈现并显示正常,但是,此页面上加载的资源没有应用版本。 / p>

Spring Boot文档中有一条说明,ERROR调度员需要特殊处理,但是,我无法弄清楚如何在WebMvcConfigurerAdapter的上下文中应用此建议。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我在我的开源项目中遇到了同样的问题,我就这样解决了。

我创建了一个像这样的@Controller类:

@Controller
public class ExceptionController {

    @Autowired
    private MessageSource messageSource;

    public void setMessageSource(MessageSource messageSource) {
        this.messageSource = messageSource;
    }

    @RequestMapping("/exception")
    public String exception(Model model,Exception ex,Locale locale,HttpServletRequest httpRequest,HttpServletResponse httpResponse){

        ex.printStackTrace();

        model.addAttribute("templatePath", "exception/exception");
        model.addAttribute("template", "content");
        try{
            model.addAttribute("exceptionMessage",messageSource.getMessage(String.format("exception.body.%s",httpResponse.getStatus()),new Object[]{},locale));
        } catch (NoSuchMessageException e){
            model.addAttribute("exceptionMessage",messageSource.getMessage("exception.body",new Object[]{},locale));
        }
        return "index";
    }
}

然后我以这种方式自定义servlet容器配置:

  @Bean
    public EmbeddedServletContainerCustomizer exceptionHandling() {
        return container -> container.addErrorPages(new ErrorPage("/exception"));
    }

在这个案例中,我为错误/异常创建一个特殊页面,然后配置嵌入式tomcat以便在出现异常时使用此URL

在Spring启动的自动配置类中,您可以在org.springframework.boot.autoconfigure.web.BasicErrorController中看到此文档:

Basic global error {@link Controller}, rendering {@link ErrorAttributes}. More specific
 * errors can be handled either using Spring MVC abstractions (e.g.
 * {@code @ExceptionHandler}) or by adding servlet
 * {@link AbstractEmbeddedServletContainerFactory#setErrorPages container error pages}

我希望这可以帮到你