【问题标题】:How to inject session scope bean in interceptor using java config with Spring如何使用带有 Spring 的 java config 在拦截器中注入会话范围 bean
【发布时间】:2014-02-19 15:55:28
【问题描述】:

我正在开发一个完整的 Spring 3.1 和 servlet 3.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 配置中检测并实例化范围会话代理 bean?

【问题讨论】:

    标签: java spring session spring-mvc interceptor


    【解决方案1】:

    解决办法是在java config类中使用注解:

    @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 注释。

    【讨论】:

      【解决方案2】:

      您发布的内容有效,但您没有利用 Spring 的自动装配功能。如果您有许多服务或其他 bean 可以注入到您的 MyInterceptor bean 中。

      相反,只需为您的 MyInterceptor 创建一个 @Bean 方法

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

      【讨论】:

        猜你喜欢
        • 2015-11-23
        • 2013-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-29
        • 2010-10-29
        相关资源
        最近更新 更多