访问控制器
我与会话范围豆春季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?
是的 - 请参阅section 3.4.5.4 of the Spring manual, "Scoped beans as dependencies"。
简而言之,您可以要求Spring将会话范围的bean包装在单例代理中,该代理在您调用范围bean上的方法时查找正确的会话。这称为“作用域代理”,并使用配置宏<aop:scoped-proxy>
。然后,您可以按照其他方式(例如<property>
或@Autowired
)注入参照。详细信息请参阅上面的链接。
关于此评论:
我尝试运用这种技术。我把 定义在豆 的定义里面并且I @ Autowired'd private UserInfo userInfo。它似乎工作, 但由于某种原因不能被正确执行这个bean的setter 功能... i.imgur.com/zkxVA.png - 彼得1小时 前
如果您使用的界面 - 基于代理的代理,除非接口具有setter方法,否则setter方法在代理上不可用。
基于接口的代理?我不熟悉Spring,Java Web开发和设计模式,所以我害怕我不知道你在描述什么。我只知道我想访问并更新该控制器类中的'userInfo' bean。我很抱歉,如果这不是有用的。 :) – Pieter 2011-05-08 18:15:29
默认情况下,Spring通过在运行时实现接口来创建代理。因此,代理上可用的唯一方法是在UserInfo实现的任何接口中定义的方法(如果有的话)。您可能必须创建一个包含setUserName()方法的合适接口。
或者,您需要强制执行基于CGI的代理(代理是在运行时创建的类的子类,因此不需要接口)。注明:
<bean id="userInfo" class="net.sandbox.sessionbeans.UserInfo" scope="session" >
<aop:scoped-proxy proxy-target-class="true"/>
</bean>
如果你不喜欢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)
我试着应用这种技术。我在bean定义里放了' ',并在''Autowired''d'private UserInfo userInfo'中。它似乎工作,但由于某种原因,豆的setter函数不能正确执行... http://i.imgur.com/zkxVA.png –
Pieter
2011-05-08 16:02:37
@Pieter上述任何进展?,我面临同样的问题 – Sudarshan 2012-09-03 12:38:18
@Sudarshan我不久前创建了这个网站作为短期学校项目的一部分,我不再为此工作。抱歉!祝你好运找到解决方案。 – Pieter 2012-09-03 16:08:51