tim*_*ooo 5 ejb java-ee maven cdi jsf-2
我有一个maven JSF项目,其中有几个模块部署到Glassfish 3.1.2.2.
结果EAR的结构:
|-- lib
|-- META-INF
|-- core-module.jar (packaged as ejbModule by maven)
| |-- com
| | |-- ApplicationSettings.java
| | |-- Module.java (Module interface)
| | `-- ModuleCORE.java (implementation of Module interface)
| `-- META-INF
| `-- beans.xml
`-- presentation-module.war (packaged as warModule by maven)
|-- WEB-INF
| |-- beans.xml
| `-- lib
| |-- jar-module.jar
| | |-- com
| | | `-- ModuleEXT1.java (implementation of Module interface)
| | `-- META-INF
| | `-- beans.xml
| `-- another-jar-module.jar
| |-- com
| | `-- ModuleEXT2.java (implementation of Module interface)
| `-- META-INF
| `-- beans.xml
|-- images
|-- css
|-- js
`-- listModules.xhtml
Run Code Online (Sandbox Code Playgroud)
我有三个模块:
EJB模块中存在以下接口:
//Module.java
public interface Module {
public String getName();
}
Run Code Online (Sandbox Code Playgroud)
每个模块本身实现接口并返回其名称:
在核心模块中,有以下bean listModules.xhtml引用以显示模块列表:
//ApplicationSettings.java
@ApplicationScoped
@Named
public class ApplicationSettings {
@Inject
@Any
private Instance<Module> modules;
public List<String> getModuleList() {
List<String> result = new ArrayList<String>();
for (Module module : modules) {
result.add(module.getName());
}
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
现在问题是只有core-Module的实现在Instances列表中.WEB-INF/lib尽管各自META-INF/beans.xml存在,但未找到内部模块的实现.
有人可以向我解释为什么CDI找不到Module界面的所有实例?
旁注:@Named来自JAR内部的其他bean WEB-INF/lib是可注入的/可以在xhtml文件中使用.所以基本上CDI正在完成它的工作,因此正在检查目录.
一般来说,将 EAR 与 CDI 结合使用往好里说是很棘手,往坏了说是毫无结果。如果您没有使用 EAR 的硬性要求,如果您可以将core-module其放入 EAR 中,WEB-INF/lib您最终会得到您期望的结果。
| 归档时间: |
|
| 查看次数: |
1055 次 |
| 最近记录: |