耳朵文件:
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
.war
lib
GreeterResource
@Inject Greeter greeter;
在 GlassFish 3.1.2.2 (Weld 1.1.8) 中部署它会产生一个不满足的@Inject
位置依赖错误。怎么回事?
为什么?整个应用程序中的唯一Greeter
实例是一个 EJB 实现,它位于一个 bean 存档中。资源类位于 bean 存档中。我阅读规范时说会话 bean 自动将其业务本地接口注册为 bean 类型。