将bean注入打包在共享库中的过滤器

时间:2013-03-12 07:30:14

标签: java-ee-6 cdi servlet-filters ejb-3.1

我有一个具有以下结构的JavaEE6应用程序:

app.ear
  META-INF
    application.xml
  lib
    commmon-server-lib.jar
  webapp1.war
  webapp2.war
  services-ejb.jar

两个webapps在MANIFEST.MF(瘦战争)的Class-Path条目中都有common-server-lib.jar。

application.xml中:

<application>
  <module>
    <ejb>services-ejb.jar</ejb>
  </module>
  <module>
    <web>
      <web-uri>webapp1.war</web-uri>
      <context-root>/webapp1</context-root>
    </web>
  </module>
  <module>
    <web>
      <web-uri>webapp2.war</web-uri>
      <context-root>/webapp2</context-root>
    </web>
  </module>
  <library-directory>lib</library-directory>
</application>

common-server-lib.jar中,有一个Web过滤器,应该注入少量EJB和其他CDI托管bean。此过滤器在两个webapps的web.xml中定义。

common-server-lib.jar并且战争在适当的地方有beans.xml

现在问题是,当我尝试将此应用程序部署到Glassfish时,我得到这样的错误:

Class [ Lcom/acme/UserService; ] not found. Error while loading 
    [ class com.acme.filter.MyFilter ]

UserService服务位于services-ejb.jar

所以我的问题是:我做错了什么......?在共享库中定义Web组件(使用注入它的依赖项)是否有问题?

修改

在JSR-315(Servlets 3.0最终规范)的第15.5节中,我们可以找到:

In a web application, classes using resource injection will have their annotations
processed only if they are located in the WEB-INF/classes directory, or if they are
packaged in a jar file located in WEB-INF/lib.

我已将common-server-lib.jar移动到两个webapps的WEB-INF / lib目录中,但我仍然遇到同样的问题; / ...

1 个答案:

答案 0 :(得分:0)

经过几个小时的挣扎,我找到了解决方案:

  1. 使用我的过滤器
  2. web-fragment.xml添加到commmon-server-lib.jar
  3. 从webapps web.xml
  4. 中删除过滤器规范
  5. 更改maven fonfiguration以从WEB-INF/lib删除所有jar 除commmon-server-lib.jar
  6. 之外的目录
  7. 从EAR commmon-server-lib.jar目录
  8. 中删除/lib