我正在尝试为我的控制器的所有设置默认模型值,这是由我的HTML模板的布局解释的(这是为所有页面添加顶部横幅,例如至于警告即将到来的维修)。我用@ControllerAdvice
方法编写了一个@ModelAttribute
类,这在我的所有自定义控制器上都能正常工作。
但是,当我访问直接使用ViewControllerRegistry
注册的映射时,它什么都不做;该方法从未被调用过,ParameterizableViewController
似乎绕过了正常的绑定和模型生成。
有没有办法编写可以应用于视图控制器和自定义控制器的建议?
答案 0 :(得分:2)
有没有办法编写将应用于视图的建议 控制器和自定义控制器?
对于您的特定用例,我建议您注册HandlerInterceptor
并将您的常用模型属性添加到ModelAndView
方法的postHandle
实例中。如下所示:
public class CommonModelInterceptor extends HandlerInterceptorAdapter {
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
modelAndView.addObject("Favorite Quote", "Welcome to the real world");
// Go crazy with modelAndView
}
}
另外,不要忘记注册你的拦截器:
public class WebConfig extends WebMvcConfigurerAdapter {
// Usual stuff
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CommonModelInterceptor());
}
}
答案 1 :(得分:0)
@ControllerAdvice和其他相关注释由使用@EnableWebMcv或
时自动注册的RequestMappingHandlerAdapter处理其他处理方法,例如资源或视图控制器由HttpRequestHandler和SimpleControllerHandlerAdapter处理,它们没有@ControllerAdvice的知识。
您可以编写一个自定义的HandlerInterceptor,它是应用程序范围的,用于处理公共逻辑,并使用WebMvcConfigurer的addInterceptors方法来注册拦截器