gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:16:05 26 4
gpt4 key购买 nike

我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com