2011-05-08 125 views
4

我与会话范围豆春季3实验中一个会话范围的bean我有以下bean定义:访问控制器

<bean id="userInfo" class="net.sandbox.sessionbeans.UserInfo" scope="session" /> 

这里是net.sandbox.controllers.RegistrationController,需要接入控制器类这个bean。为了简洁起见,我已经拿出了进口产品。

@Controller 
@RequestMapping("/register") 
public class RegistrationController { 
    private UserInfo userInfo; // This should reference the session-scoped bean 

    @RequestMapping(method = RequestMethod.GET) 
    public String showRegForm(Model model) { 
     RegistrationForm regForm = new RegistrationForm(); 
     model.addAttribute("regform", regForm); 
     return "regform"; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String validateForm(@Valid RegistrationForm regForm, BindingResult result, Model model) { 
     if (result.hasErrors()) { 
      return "regform"; 
     } 

     userInfo.setUserName(regForm.getFirstName()); 
     model.addAttribute("regform", regForm); 
     return "regsuccess"; 
    } 
} 

是否有办法来自动配合我RegistrationController定义为成员变量private UserInfo userInfo会话作用域的bean?

回答

6

是的 - 请参阅section 3.4.5.4 of the Spring manual, "Scoped beans as dependencies"

简而言之,您可以要求Spring将会话范围的bean包装在单例代理中,该代理在您调用范围bean上的方法时查找正确的会话。这称为“作用域代理”,并使用配置宏<aop:scoped-proxy>。然后,您可以按照其他方式(例如<property>@Autowired)注入参照。详细信息请参阅上面的链接。

+2

我试着应用这种技术。我在bean定义里放了'',并在''Autowired''d'private UserInfo userInfo'中。它似乎工作,但由于某种原因,豆的setter函数不能正确执行... http://i.imgur.com/zkxVA.png – Pieter 2011-05-08 16:02:37

+0

@Pieter上述任何进展?,我面临同样的问题 – Sudarshan 2012-09-03 12:38:18

+0

@Sudarshan我不久前创建了这个网站作为短期学校项目的一部分,我不再为此工作。抱歉!祝你好运找到解决方案。 – Pieter 2012-09-03 16:08:51

0

关于此评论:

我尝试运用这种技术。我把 定义在豆 的定义里面并且I @ Autowired'd private UserInfo userInfo。它似乎工作, 但由于某种原因不能被正确执行这个bean的setter 功能... i.imgur.com/zkxVA.png - 彼得1小时 前

如果您使用的界面 - 基于代理的代理,除非接口具有setter方法,否则setter方法在代理上不可用。

+1

基于接口的代理?我不熟悉Spring,Java Web开发和设计模式,所以我害怕我不知道你在描述什么。我只知道我想访问并更新该控制器类中的'userInfo' bean。我很抱歉,如果这不是有用的。 :) – Pieter 2011-05-08 18:15:29

1

默认情况下,Spring通过在运行时实现接口来创建代理。因此,代理上可用的唯一方法是在UserInfo实现的任何接口中定义的方法(如果有的话)。您可能必须创建一个包含setUserName()方法的合适接口。

或者,您需要强制执行基于CGI的代理(代理是在运行时创建的类的子类,因此不需要接口)。注明:

<bean id="userInfo" class="net.sandbox.sessionbeans.UserInfo" scope="session" > 
    <aop:scoped-proxy proxy-target-class="true"/> 
</bean> 
0

如果你不喜欢XML,你也可以使用ObjectFactory<T>这样的:

@RestController 
public class MyController { 
    private final ObjectFactory<MySessionScopedComponent> OFSession; 

    @Autowired 
    public MyController(ObjectFactory<MySessionScopedComponent> OFSession) { 
     this.OFSession = OFSession; 
    } 

    @RequestMapping(path = "/path", method = RequestMethod.GET) 
    public String myMethod() { 
     MySessionScopedComponent sessionBean = OFSession.getObject(); 
     // Do some stuff 
     return bean.myValue(); 
    } 
} 

注:测试与Spring 1.5.6启动(春季4.3)