2014-01-28 48 views
4

我正在開發完整的Spring 3.1和servlet 3.0應用程序。但我的攔截有作用域爲代理的私人性質:如何在Spring中使用java config注入會話作用域bean

public class MyInterceptor extends HandlerInterceptorAdapter { 

    @Ressource 
    private UserSession userSession; 
} 

用戶會話被定義爲:

@Component 
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class UserSession implements Serializable { 
    .... 
} 

當使用攔截這個用戶會話,java的拋出了一個userSessionNullPointerException

我認爲這個問題來自於我javaconfig面向Spring配置:

@EnableWebMvc 
@ComponentScan(basePackages = {"com.whatever"}) 
@Configuration 
public class WebAppConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(new MyInterceptor()); 
    } 

    ... 
} 

的問題是,攔截器手動instantied,所以沒有儀器的會話代理機制。因此,問題是:「我如何才能讓春天在我的應用程序的Java配置檢測和實例範圍會話代理豆

回答

6

你貼什麼作品,但你沒有利用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() 
    } 

    ... 
} 
0

的解決方案是在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); 
    } 

    ... 
} 

而且你需要刪除@ScopeUserSession@Bean註解。

相關問題