Spring Controller:我可以在调用每个@RequestMapping方法之前调用一个方法吗?

Dav*_*rks 19 java controller spring-mvc

我有一些常见的组件,它们始终存在于给定Controller类所服务的每个页面中.

在每个@RequestMapping方法的开头,我使用这些常见组件填充模型.

有没有办法定义在每个控制器方法之前调用的方法,以便我可以将所有这些复制/粘贴到一个地方?

pto*_*mli 21

只需注释一个方法 @ModelAttribute

下面会在名称为"foo"的模型中添加一个Foo实例

@ModelAttribute("foo")
public Foo foo() {
    return new Foo();
}
Run Code Online (Sandbox Code Playgroud)

请参阅@ModelAttribute文档


Bad*_*dal 15

拦截器是解决方案.它有方法preHandler和postHandler,它们将分别在每个请求之前和之后调用.您可以挂钩到每个HTTPServletRequest对象,也可以通过挖掘它来传递几个.

这是一个示例代码:

@Component
public class AuthCodeInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        // set few parameters to handle ajax request from different host
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
        response.addHeader("Access-Control-Max-Age", "1000");
        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
        response.addHeader("Cache-Control", "private");

        String reqUri = request.getRequestURI();
        String serviceName = reqUri.substring(reqUri.lastIndexOf("/") + 1,
                reqUri.length());
                if (serviceName.equals("SOMETHING")) {

                }
        return super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

        super.postHandle(request, response, handler, modelAndView);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,您将为所有控制器调用此命令.有没有办法在不明确定义请求映射的情况下将其紧密到控制器? (3认同)

小智 5

所有具有@ModelAttribute批注的方法都将在特定处理程序之前调用,并将返回值添加到Model实例。然后,您可以在视图中将此属性用作处理程序参数。

我发现此博客非常有用。