跨dao方法使用会话对象UserBean

时间:2013-10-29 07:37:47

标签: java spring-mvc

我从会话

获得一个Object说UserBean
public class UserBean {

    private String username;
    private String userid;
    private String userType;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getUserid() {
        return userid;
    }
    public void setUserid(String userid) {
        this.userid = userid;
    }
    public String getUserType() {
        return userType;
    }
    public void setUserType(String userType) {
        this.userType = userType;
    }

}

现在我想在我的许多dao方法中使用这个bean。我面临的问题是我必须修改我的dao参数以包含这个bean信息,我认为这不是一个好的设计。

如何在不修改DAO方法的情况下包含UserBean详细信息?

我正在使用spring MVC 3

4 个答案:

答案 0 :(得分:1)

我认为在DAO中访问Web上下文类并不是一个好主意,这会在层之间引入紧密耦合,并且更改表示层中的某些内容可能会影响DAO层对象。您可以将此信息作为方法参数传递给DAO类。

但是如果您真的想要访问DAO中的会话属性,可以使用RequestContextHolder

ServletRequestAttributes request = (ServletRequestAttributes) RequestContextHolder
            .currentRequestAttributes();
HttpSession session = request.getRequest().getSession();
UserBean UserBean = (UserBean)session.getAttribute("userBean");

当您在实际Web请求之外引用请求属性时,您需要将RequestContextListener添加到您的web.xml以公开当前请求:

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener> 

答案 1 :(得分:0)

DAO层不应该知道网络会话 在经理或服务的“上层”实施与会话相关的逻辑 在你的“重构”案例中,除了做好设计之外,它还可以作为Spring MVC层和DAO之间的适配器而具有额外的好处。

答案 2 :(得分:0)

您可以在DAO类中创建一个实例变量,并为此创建一个setter和getter。

但在调用任何DAO方法之前,你必须在该DAO中设置userBean,这也不是一个好习惯,但可能是解决方案之一。

答案 3 :(得分:0)

您可以将UserBean定义为Spring bean并使用Spring的会话范围。 E.g:

<bean id="user" class="com.foo.UserBean" scope="session">
  <aop:scoped-proxy/>
</bean>

<bean id="userDao" class="com.foo.UserDao">
  <property name="user" ref="user"/>
</bean>

有关文档,请参阅Spring文档中的3.5.4.5 Scoped beans as dependencies