我的SFSB Seam组件在部署时绑定到JNDI,如此日志消息所示:
Component: example, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN,
class:com.purecharger.action.ExampleAction, JNDI: purecharger/ExampleAction/local
我的界面:
@Local
public interface Example {
public List<String> getExample();
public void destroy();
}
和我的实施:
@Stateful
@Scope(ScopeType.CONVERSATION)
@Name("example")
@Restrict("#{identity.loggedIn}")
public class ExampleAction implements Example, Serializable {
....
}
但是,当我访问xhtml页面中的voting
组件时,我收到以下错误:
javax.el.ELException: /home.xhtml: Could not instantiate Seam component: example
....
Caused by: javax.naming.NameNotFoundException: ExampleAction not bound
如果Seam足够聪明,可以使用components.xml(purecharger/#{ejbName}/local
)中的JNDI模式来安装我的组件,为什么在查找组件时它也不会应用该模式?
谢谢。
更新:
查看JBoss中的JNDIView,名称purecharger/ExampleAction/local
不受任何限制。所以我想我的问题现在变成了,为什么Seam没有将这个SFSB添加到JNDI?
答案 0 :(得分:1)
为什么Seam没有将此SFSB添加到JNDI?
那么,
如你的问题所示,我认为你有一个耳朵应用,因为它的JNDI全球地址
purecharger/ExampleAction/local
根据
进行映射<EAR_APPLICATION>/<STATEFUL_BEAN>/local
部署单个EJB模块时,JBoss中的JNDI全局地址看起来像
<STATEFUL_BEAN>/local
因为您有耳朵应用程序,每个EJB模块都应该在application.xml中声明(描述您耳朵的文件),如下所示
所以你的耳朵应用程序看起来像
pureCharger.ear
META-INF
application.xml
pureCharger-ejb.jar
pureCharger-war.war
jboss-seam.jar
lib
// libraries shared by your modules goes here
你的application.xml
<?xml version="1.0" encoding="UTF-8"?>
<application version="5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd">
<display-name>pureCharger</display-name>
<module>
<ejb>pureCharger-ejb.jar</ejb>
</module>
<module>
<ejb>jboss-seam.jar</ejb>
</module>
<module>
<web>
<web-uri>pureCharger-war.war</web-uri>
<context-root>pureCharger</context-root>
</web>
</module>
</application>
注意jboss-seam.jar是一个EJB模块,所以它也应该在application.xml文件中声明
如果可能,请使用Seam-gen生成项目。它需要注意包括项目所需的所有库,例如,可以在NetBeans中无限制地打开。
的问候,