访问控制器内的会话范围的bean

时间:2011-05-08 15:12:06

标签: spring spring-mvc

我在Spring 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";
    }
}

有没有办法自动将我定义的会话范围bean绑定到private UserInfo userInfo中的成员变量RegistrationController

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

关于此评论:

  

我尝试应用这种技术。我放    在豆子里面   定义和我@Autowired'd私人   UserInfo userInfo。它似乎工作,   但由于某种原因豆子的二传手   功能未正确执行......   i.imgur.com/zkxVA.png - 彼得1小时   前

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

答案 3 :(得分: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 Boot 1.5.6(Spring 4.3)进行测试