最初的Spring MVC会话属性集

时间:2013-08-26 05:55:47

标签: java spring spring-mvc

我使用过Spring MVC。我将会话属性值设置为

@RequestMapping(value = "/home", method = RequestMethod.GET)
        public String initHome(Model model) {
            if (!model.containsAttribute("clientObject")) {
                model.addAttribute("clientObject", createDefaultClient());
            }
            return "homeMenu";
        }

如果我点击主菜单网址(/ home),它工作正常。但如果我没有去 home意味着它将错误称为“会话属性clientObject是必需的”

所以我决定在控制器

的构造函数中设置sessionattibutes
 @Autowired
    public MyController(Model model) {
       if (!model.containsAttribute("clientObject")) {
            model.addAttribute("clientObject", createDefaultClient());
        }
    }

它也说错误

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myController'

我尝试使用RequestMapping设置也像

 @RequestMapping(value = "/", method = RequestMethod.GET)
    public void initController(Model model) {
       if (!model.containsAttribute("clientObject")) {
                    model.addAttribute("clientObject", createDefaultClient());
                }

    }

此方法也未被初步调用 我的投币器看起来像

@RequestMapping("/sample")
public class MyController {
    ..
    ..

是否可以在控制器的构造函数中设置sessionAttribute值?或者最初设置会话属性的任何其他方式?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

假设您的createDefaultClient位于控制器中,请为其添加@ModelAttribute注释。

@ModelAttribute("clientObject")
public ClientObject createDefaultClient() { ... }

此方法将在任何请求处理方法之前调用(如reference guide中所述)

如果您将其与类@SessionAttribute注释组合在一起(您可能已经拥有)。你应该能够实现你想要的目标。

在请求处理方法(使用@RequestMapping注释的方法)中,您现在可以简单地将客户端对象作为方法参数注入。

@RequestMapping(value = "/home", method = RequestMethod.GET)
public String initHome(@ModelAttribute("clientObject") ClientObject clientObject) {
    // Do something with the clientObject
    return "homeMenu";
}

这只能在同一个控制器中一致地工作,所以如果你需要在其他地方使用ClientObject(例如另一个控制器),这是行不通的(@SessionAttributes也不行专为此而设计。