如何使用java配置和Spring在拦截器中注入会话范围bean
我正在开发一个完整的Spring3.1和Servlet3.0应用程序。但是我的拦截器有一个作用域为代理的私有属性:如何使用java配置和Spring在拦截器中注入会话范围bean,java,spring,session,spring-mvc,interceptor,Java,Spring,Session,Spring Mvc,Interceptor,我正在开发一个完整的Spring3.1和Servlet3.0应用程序。但是我的拦截器有一个作用域为代理的私有属性: public class MyInterceptor extends HandlerInterceptorAdapter { @Ressource private UserSession userSession; } 用户会话定义为: @Component @Scope(value = "session", proxyMode = ScopedProxyMod
public class MyInterceptor extends HandlerInterceptorAdapter {
@Ressource
private UserSession userSession;
}
用户会话定义为:
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserSession implements Serializable {
....
}
在拦截器中使用此用户会话时,java为userSession
抛出NullPointerException
我认为问题来自我面向javaconfig的spring配置:
@EnableWebMvc
@ComponentScan(basePackages = {"com.whatever"})
@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
}
...
}
问题是拦截器是手动实例化的,因此没有会话代理机制的检测。因此,问题是:“如何让Spring在我的应用程序的java配置中检测并实例化scope会话代理bean?解决方案是在java配置类中使用注释:
@EnableWebMvc
@ComponentScan(basePackages = {"com.whatever"})
@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {
@Bean
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public UserSession userSession() {
return new UserSession();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
MyInterceptor interceptor = new MyInterceptor();
interceptor.setUserSession(userSession());
registry.addInterceptor(interceptor);
}
...
}
您需要从
UserSession
类中删除@Scope
和@Bean
注释。您发布的内容有效,但您没有利用Spring的自动连接功能。如果您有许多服务或其他Bean要注入MyInterceptor
Bean,该怎么办
相反,只需为您的MyInterceptor
@EnableWebMvc
@ComponentScan(basePackages = {"com.whatever"})
@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {
@Bean
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public UserSession userSession() {
return new UserSession();
}
@Bean
public MyInterceptor myInterceptor() {
return new MyInterceptor(); // let Spring go nuts injecting stuff
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor()); // will always refer to the same object returned once by myInterceptor()
}
...
}
你让我开心!!!谢谢你!!!