[英]How to use session scoped bean properly
我的Spring MVC应用程序中有3个类: UserDetailsInterceptor
类, MyAdvice
类和UserDetails
类(会话作用域)。
我想要完成的事情很简单:
UserDetailsInterceptor
在会话范围内的UserDetails
Bean中拦截请求并设置用户ID。 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
对象不再为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.