2010-09-19 66 views
5

我正在使用Jersey 1.4 ea和Spring 3.0以及jersey-spring集成。集成澤西島和Spring對here描述的資源類別適用。 我怎麼想要在ContainerRequestFilter中注入一個彈簧組件來做一些預處理請求。Jersey:將Spring組件注入ContainerRequestFilter

@Component 
public class SecurityFilter implements ContainerRequestFilter { 

    // UserManager is a declared spring component 
    // Injecting it should work somehow 
    @Autowired 
    private UserManager userManager; 

    @Override 
    public ContainerRequest filter(ContainerRequest request) { 
     System.out.println(userManager); 
     // prints out null on request 
    } 
} 

將應用程序部署到Glassfish時,過濾器和用戶管理器bean都已註冊。我想知道我做錯了什麼。有沒有辦法將Spring管理bean注入到ContainerRequestFilter中?

UPDATE

類的解決。問題是,如果這些bean是Java代理(與生成的代理類相對),Jersey不會獲得Spring bean。通過指定Spring總是使用代理類而不是Java代理,可以通過在彈簧配置的相應部分中指定proxy-target-class="true"屬性來解決問題。在我的場景中,我必須在<tx:annotation-driven proxy-target-class="true" />上指定它。

請參閱here瞭解更詳細的分析和可能的解決方法。

+0

在你的解決方案中,SecurityFilter是如何在web.xml文件或其他地方註冊的?我在這裏有一個問題https://stackoverflow.com/q/45509183/4636715其中ContainerRequestFilter根本沒有被訪問。 – vahdet 2017-08-08 08:51:59

回答

2

我看到與澤西島1.6和Spring 3.0.5相同的東西。使用調試器,我可以告訴大家,即使我的代碼標有@Component,Spring和新澤西州將實例自己的這個類的副本:

@Path("/beams") 
@Produces("text/xml") 
@Component 
@Scope("singleton") 
public class BeamsResource { 
} 

有一番數落,這將在未來加入澤西島的版本,但它現在似乎沒有工作。我知道這是一個可怕的解決方案,但我使用靜態成員變量來暫時將Jersey和Spring連接在一起。的Bleh。

+1

我終於遇到了這個解決方案。調試代碼證明這是澤西如何從上下文中獲得Spring bean的問題。我的想法記錄在http://jersey.576304.n2.nabble.com/AW-Jersey-ContainerRequestFilter-as-Spring-component-td5724265.html – nre 2011-05-15 12:04:04

+0

請參閱我的問題的更新。 – nre 2011-05-15 12:15:09

相關問題