我的 Spring MVC 应用程序中有 3 个类:一个 UserDetailsInterceptor 类、一个 MyAdvice 类和一个 UserDetails 类( session 范围)。
我想要完成的事情很简单:
UserDetailsInterceptor
拦截请求并在 session 范围的UserDetails
bean 中设置用户 ID。- 稍后,当调用 AOP 建议类中的方法时,从 session 范围的
UserDetails
bean 中检索用户的 ID。
问题(也在下面的代码中标记):
MyAdvice
类中的UserDetails
对象为 null。- 在
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 isnull
inMyAdvice
class.
如果 MyAdvice
实例由 Spring 管理,则不可能。您必须自己实例化它,而不是从上下文中获取它。
如果 Spring 不管理该对象,它就无法将任何内容注入(inject)到 @Autowired
目标中,因此您的字段仍为 null
。
如果 Spring 正在管理您的对象(一个 bean),并且无法解析依赖关系,它就会抛出异常。
关于java - 如何正确使用 session 作用域 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22459712/