我有一个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
的上下文中应用此建议。
感谢任何帮助。
答案 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}
我希望这可以帮到你