3

耳朵文件:

ear
 +--lib
 |   +--API jar
 |   |     +-- com.foobar.Greeter.class (interface)
 |   |         (look, ma, no META-INF/beans.xml on purpose)
 |   |
 |   +--JAX-RS endpoint jar
 |         +-- com.foobar.GreeterResource.class (has @Inject Greeter greeter;)
 |         +-- META-INF/beans.xml
 |   
 +--EJB jar
 |   +-- com.foobar.GreeterBean implements com.foobar.Greeter (@Stateless, @Local)
 |   +-- META-INF/beans.xml
 |
 +--JAX-RS skinny war (no libs)
     +-- WEB-INF/beans.xml (maybe not necessary?)
     +-- WEB-INF/classes/com.foobar.Application 
                                   (empty subclass of JAX-RS Application)

用英语回顾一下:

  • API jar 文件。包含Greeter接口。存在于lib目录中。
  • EJB jar 文件。包含一个@Stateless @Local实现Greeter. 还包含一个META-INF/beans.xml文件。CDI说这是使它成为 bean 存档所必需的。
  • 瘦身战。仅存在一个(空)Application类作为 JAX-RS 的引导部分。端点不在其中。包含一个WEB-INF/beans.xml文件,尽管我承认我不确定这是必要的,因为根据定义 ,仅将目录(此处不存在)WEB-INF/beans.xml标记为 bean 存档。classes
  • JAX-RS 端点 jar 文件。这个有点奇怪。存在于目录中,因此存在于类路径中,但不在文件的目录中(故意)。根据 JAX-RS 1.1 规范,由 JAX-RS 应用程序自动发现,因此其中的类可能处于 JAX-RS 和 CDI 之间的某种拉锯战中。 包含..ear lib.warlibGreeterResource@Inject Greeter greeter;

在 GlassFish 3.1.2.2 (Weld 1.1.8) 中部署它会产生一个不满足的@Inject位置依赖错误。怎么回事?

为什么?整个应用程序中的唯一Greeter实例是一个 EJB 实现,它位于一个 bean 存档中。资源类位于 bean 存档中。我阅读规范时说会话 bean 自动将其业务本地接口注册为 bean 类型

4

0 回答 0