耳文:
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)
回顾一下英文:
Greeter
接口。出现在lib
目录中。@Stateless
的{{1}} @Local
EJB。还包含Greeter
文件。 CDI says this is necessary使其成为一个bean存档。META-INF/beans.xml
类作为JAX-RS的bootstrappy部分。端点不在其中。包含Application
文件,但我承认我不确定这是否必要,因为by definition WEB-INF/beans.xml
仅标记WEB-INF/beans.xml
目录(此处不存在) bean archive。classes
.ear
目录中,所以在类路径中,但不在lib
文件的.war
目录中(有意)。根据JAX-RS 1.1规范发现 - 由JAX-RS应用程序自动发现,因此其中的类可能是JAX-RS和CDI之间的一种拉锯战。 lib
包含GreeterResource
。在GlassFish 3.1.2.2(Weld 1.1.8)中部署它会导致@Inject Greeter greeter;
位置的不满足的依赖性错误。 WTF?
为什么呢?整个应用程序中唯一的@Inject
实例是EJB实现,它位于bean存档中。资源类位于bean归档中。我将规范读作saying that session beans automatically have their business local interfaces registered as bean types。