java - 如何正确使用 session 作用域 bean

标签 java session spring-mvc spring-aop

我的 Spring MVC 应用程序中有 3 个类:一个 UserDetailsInterceptor 类、一个 MyAdvice 类和一个 UserDetails 类( session 范围)。

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

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

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

  1. MyAdvice 类中的 UserDetails 对象为 null。
  2. UserDetailsInterceptor 中,userDetails.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对象不再为空。然而,它与 UserDetailsInterceptor 中的对象不是同一对象。那么这个 bean 实际上并不是“ session 范围的”?

答案:

问题出在以下代码中:

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

它们都不是由 spring 管理的。结果,事情正在接线,并没有按照我们预期的方式工作。

最佳答案

这个

UserDetails object is null in MyAdvice class.

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

如果 Spring 不管理该对象,它就无法将任何内容注入(inject)到 @Autowired 目标中,因此您的字段仍为 null

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

关于java - 如何正确使用 session 作用域 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22459712/

相关文章:

jsp - session 获取 bool 值的属性

c# - 从 JavaScript 访问 ASP.NET session 变量

java - EL1008E :(pos 8):Property or field cannot be found on object of type '...security.web.access.expression.WebSecurityExpressionRoot' maybe not public?

java - 如何跟踪普通 Spring 微服务应用程序(非 Spring boot)中的请求?

Java String - 包含被 'offset' 隐藏的部分

java - 有没有办法从模型列表中选择所有内容?

php - 在ini文件中读写多维php数组

java - 如何使用 Java 的正则表达式查找 (* comments *)?

java - 更新以昵称为主键的表的行

java - 如何从 Spring MVC 登录