使用相同的请求映射重载spring控制器方法

时间:2011-10-10 17:34:54

标签: java spring spring-mvc

我有一个会话属性:user,我有一个网址,我希望所有登录用户都可以查看这些网址,并且可以由未以用户身份登录的人公开查看。

所以我想做的是:

@Controller("myController")
@SessionAttributes({"user"})
public class MyController {

@RequestMapping(value = "/MyPage/{id}", method = RequestMethod.GET)
public ModelAndView getPage(@PathVariable Integer id) {
   return modelandview1;
}

@RequestMapping(value = "/MyPage/{id}", method = RequestMethod.GET)
public ModelAndView getPage(@PathVariable Integer id, @ModelAttribute User user){
  return modelandview2;
}

但是,我觉得它不会起作用...建议非常欢迎。

2 个答案:

答案 0 :(得分:2)

你只需要第二种方法,即带有用户文章的方法。如果在没有可用于填充User模型的请求属性的情况下调用它,您将获得具有所有null(或所有默认)字段值的User实例,然后在方法体中相应地处理每种情况

答案 1 :(得分:1)

我认为这不是@SessionAttributes的正确理由。此注释通常用于保留表单支持对象的原始实例,以避免通过隐藏的表单字段传递其状态的不相关部分。

您的情绪完全不同,因此最好明确使用HttpSession

@RequestMapping(value = "/MyPage/{id}", method = RequestMethod.GET)
public ModelAndView getPage(@PathVariable Integer id, HttpSession session) {
    User user = (User) session.getAttribute(...);
    if (user != null) {
        ...
    } else {
        ...
    }
}

另请注意,@ModelAttribute是数据绑定的主题 - 用户可以通过传递请求参数来更改其字段。在这种情况下你肯定不想要它。