繁体   English   中英

如何正确使用会话范围的bean

[英]How to use session scoped bean properly

我的Spring MVC应用程序中有3个类: UserDetailsInterceptor类, MyAdvice类和UserDetails类(会话作用域)。

我想要完成的事情很简单:

  1. UserDetailsInterceptor在会话范围内的UserDetails Bean中拦截请求并设置用户ID。
  2. 稍后,当调用AOP建议类中的方法时,从会话范围内的UserDetails bean中检索用户的ID。

问题 (也在下面的代码中标记):

  1. MyAdvice类中的UserDetails对象为null。
  2. UserDetailsInterceptoruserDetails.setUserID(request.getRemoteUser()); 什么也没做。

代码

UserDetailsInterceptor类:

public class UserDetailsInterceptor extends HandlerInterceptorAdapter {

    @Autowired
    private UserDetails userDetails;

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //set user ID, but next line doesn't do anything for some reason (e.g. `userID` is still null)
        userDetails.setUserID(request.getRemoteUser());
        return true;
    }
}

MyAdvice类:

public class MyAdvice implements MethodInterceptor {

    @Autowired
    private UserDetails userDetails; //It's null

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        //Print user ID
        System.out.println(userDetails.getID());
        return invocation.proceed();
    }
}

UserDetails类:

public class UserDetails {

    private String userID;

    public void setUserID(String userID) {
        this.userID= userID;
    }

    public String getUserID() {
        return this.userID;
    }
}

dispatcher-servlet.xml

<bean id="userDetails " class="package.UserDetails " scope="session">
    <aop:scoped-proxy/>
</bean>

MyPointcutAdvisor类:

public class MyPointcutAdvisor implements PointcutAdvisor {

    private MyPointcut pointcut = new MyPointcut();
    private MyAdvice advice = new MyAdvice();

    @Override
    public Pointcut getPointcut() {
        return this.pointcut;
    }

    @Override
    public Advice getAdvice() {
        return this.advice;
    }

    @Override
    public boolean isPerInstance() {
        return false;
    }
}

有什么想法吗? 提前致谢。

更新:

通过注册MyAdvice类,其中的userDetails对象不再为null。 但是,它与UserDetailsInterceptor对象不同。 因此,bean实际上不是“会话作用域”的吗?

问题在于以下代码:

private MyPointcut pointcut = new MyPointcut();
private MyAdvice advice = new MyAdvice();

他们都不在春季之前管理。 结果,事情正在按预期方式进行,而不是按预期进行。

这个

MyAdvice类中的UserDetails对象为null

如果MyAdvice实例由Spring管理,则不可能。 您必须自己实例化它,而不是从上下文中获取它。

如果Spring不管理该对象,则无法将任何东西注入@Autowired目标,因此您的字段保持为null

如果Spring正在管理您的对象(一个bean),并且无法解析该依赖关系,它将抛出异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM