Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用java配置和Spring在拦截器中注入会话范围bean_Java_Spring_Session_Spring Mvc_Interceptor - Fatal编程技术网

如何使用java配置和Spring在拦截器中注入会话范围bean

如何使用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

我正在开发一个完整的Spring3.1和Servlet3.0应用程序。但是我的拦截器有一个作用域为代理的私有属性:

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()
    }

    ...
}

你让我开心!!!谢谢你!!!