2012-05-29 108 views
1

我想將會話Bean注入到我的ServletFilter中,這似乎不起作用。你能告訴我如何做到這一點?Java EE 5/Servlet 2.5將EJB注入ServletFilter

public class MyExample implements Filter { 
    @EJB 
    private MyBean someEjb; 

    @Override 
    public void destroy() { 
    } 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 
        FilterChain filterChain) throws IOException, ServletException{ 
     someEjb.toString(); 
    } 
} 

由於myEjb爲null,導致NullPointerException。使用的平臺是JBoss 5.1 MyBean可以從其他EJB或Servlet正確訪問。

謝謝。


問題就解決了(雖然我不知道爲什麼):

應用程序由三個神器: - 包含EJB的 罈子 - 包含servlet的 一戰 - 同時包含上述的耳朵

如果我把過濾器封裝在罐子裏,就會出現問題。如果我將它與servlet一起打包在戰爭中,則不會發生此問題。

所以,立即解決問題,但不明白。

也許有人可以幫助我理解?

回答

3

如果servletEJB都不在單個ear文件中,則在注入EJB時必須使用@EJB(mappedName="name")。查詢this post瞭解更多詳情。

相關鏈接:Injection from outside modules

當然,Filter是有點兒Servlet,因此被稱爲 「Servlet過濾器」。並且ServletFilter都是Web組件,因此屬於Web歸檔文件,.war,而不是Java歸檔文件,.jar。將不會掃描jar中的過濾器以注入該類別註釋,並將以任何其他常規Java類的形式進行處理。

+0

嗨,謝謝你的回答。不幸的是,他們都在同一個耳朵。 –

+0

@FabianFörster:嘗試使用'@EJB(beanName =「MyBeanImpl」)'。 –

+0

@FabianFörster:當然,'Filter'是一種'Servlet',因此被稱爲'Servlet Filter'。 「Servlet」和「Filter」都是Web組件,因此它屬於Web檔案,「.war」,而不是Java檔案,「.jar」。 –

0

我們遇到了類似的問題,我們有一些打包在一個Jar裏面的組件(沒有被處理),我們有一些@WebFilter和和@WebListener組件。

目的是告訴容器掃描其他罐子尋找其他註釋組件。

我們完成了將屬性metadata-complete添加到web.xml聲明的目標。 例子:

<?xml version="1.0" encoding="UTF-8"?> 
 
<web-app version="3.0" 
 
      xmlns="http://java.sun.com/xml/ns/javaee" 
 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
 
      metadata-complete="false"> 
 
    
 
    ...NORMAL_CONTENT_HERE... 
 
    
 
</web-app>

希望它能幫助。