Spring MVC:将请求属性绑定到控制器方法参数

tob*_*bik 21 java spring spring-mvc

在Spring MVC中,很容易将请求参数绑定到处理请求的方法参数.我只是用@RequestParameter("name").但是我可以对请求属性执行相同的操作吗?目前,当我想访问请求属性时,我必须执行以下操作:

MyClass obj = (MyClass) request.getAttribute("attr_name");
Run Code Online (Sandbox Code Playgroud)

但我真的想用这样的东西代替:

@RequestAttribute("attr_name") MyClass obj
Run Code Online (Sandbox Code Playgroud)

不幸的是,它没有这种方式.我可以以某种方式扩展Spring功能并添加我自己的"绑定器"吗?

编辑 (我想要实现的目标):我将当前登录的用户存储在请求属性中.因此,每当我想访问当前登录的用户(这几乎都在每个方法中)时,我必须编写这个额外的行user = (User) request.getAttribute("user");.我想尽量缩短它,最好将它作为方法参数注入.或者,如果您知道如何通过拦截器和控制器传递某些东西,我会很高兴听到它.

tob*_*bik 33

好吧,我终于明白了模型的工作原理和@ModelAttribute用途.这是我的解决方案.

@Controller 
class MyController
{
    @ModelAttribute("user")
    public User getUser(HttpServletRequest request) 
    {
        return (User) request.getAttribute("user");
    }

    @RequestMapping(value = "someurl", method = RequestMethod.GET)
    public String HandleSomeUrl(@ModelAttribute("user") User user)  
    {
        // ... do some stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

getUser()标有@ModelAttribute注释的方法将自动填充User user标记为的所有参数@ModelAttribute.因此,当调用HandleSomeUrl方法时,调用看起来像MyController.HandleSomeUrl(MyController.getUser(request)).至少这是我的想象.很酷的是,用户也可以从JSP视图访问而无需任何进一步的努力.

这解决了我的问题,但我还有其他问题.有一个共同的地方,我可以把这些@ModelAttribute方法,所以他们是我的所有控制器共同的?我可以以某种方式从preHandle()拦截器的方法内部添加模型属性吗?


Bri*_*ace 10

使用(截至Spring 4.3)@RequestAttribute:

@RequestMapping(value = "someurl", method = RequestMethod.GET)
public String handleSomeUrl(@RequestAttribute User user) {
    // ... do some stuff
}
Run Code Online (Sandbox Code Playgroud)

或者如果请求属性名称与方法参数名称不匹配:

@RequestMapping(value = "someurl", method = RequestMethod.GET)
public String handleSomeUrl(@RequestAttribute(name="userAttributeName") User user) {
    // ... do some stuff
}
Run Code Online (Sandbox Code Playgroud)