1

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

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

如果我单击主菜单 url(/home),它工作正常。但如果我没有回家意味着它会说错误,因为“需要会话属性 clientObject”

所以我决定在控制器的构造函数中设置会话属性

 @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());
                }

    }

这个方法最初也没有被调用,我的 cointroller 看起来像

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

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

在此先感谢您的帮助。

4

1 回答 1

3

假设您createDefaultClient在控制器中添加@ModelAttribute注释。

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

此方法将在任何请求处理方法之前调用(如参考指南中所述)

如果您将其与@SessionAttribute您的课程上的注释(您可能已经拥有)结合起来。你应该能够实现你想要的。

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

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

这只会在同一个控制器中始终如一地工作,因此如果您需要在ClientObject其他地方使用(例如另一个控制器),这将不起作用(也不是@SessionAttributes为此而设计的)。

于 2013-08-26T09:08:56.443 回答