我是EJB3的新手,在访问部署为ear文件中的ejb模块的@Remote @Stateless bean时,我遗漏了一些东西。我想从soup.ear访问lima.ear中的远程bean。
以下是我现在正在做的事情(略有缩写):
//deployed under lima.ear
@Remote
@Stateless
public interface LimaBean {
String sayName();
}
我想将LimaBean放入汤中:
//deployed in soup.ear
@Stateless
public class Soup implements SoupLocal {
@EJB
private LimaBean limaBean;
public String taste() {
return limaBean.sayName();
}
}
当我启动JBoss时,我收到以下错误:
java.lang.RuntimeException:无法为容器Soup解析@EJB的全局JNDI名称:引用类:com.example.LimaBean ejbLink:未被任何EJB使用
我很难找到这个ejbLink的内容,如果这是正确的道路。
如果我将LimaBean部署为jboss中的jar文件,那么一切都很有效!
我在一篇文章中刊登了一篇名为“2.5.3。不同罐子和不同耳朵中的豆子之间的参考”的文章
(http://jonas.ow2.org/doc/howto/jboss2_4-to-jonas3_0/html/x111.html)
SB_BrowseRegions的jboss.xml文件示例:
<jboss>
<session>
<ejb-name>SB_BrowseRegions</ejb-name>
<ejb-ref>
<ejb-ref-name>ejb/Region</ejb-ref-name>
<jndi-name>protocol://serverName/directory/RegionHome</jndi-name>
</ejb-ref>
</session>
</jboss>
如果我触摸了汤。在JBoss启动之后,它会部署得很好,所以我假设我需要指定一个依赖,就像上面的文章所说的那样。
但即使在部署之后,我在访问远程LimaBean时遇到错误:
引起:java.lang.IllegalArgumentException:无法将com.soup.LimaBean字段com.soup.Soup.limaBean设置为$ Proxy147 at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146) at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150) at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63) 在java.lang.reflect.Field.set(Field.java:657) 在org.jboss.injection.JndiFieldInjector.inject(JndiFieldInjector.java:115) ......还有49个
我尝试过一些事情但是,如果有人能指出我正确的方向,我会很感激。
答案 0 :(得分:2)
看起来JNDI属性需要设置为好像它是app服务器之外的远程客户端,因为我们设置了耳朵隔离。
properties.put(Context.PROVIDER_URL, url);
InitialContext ctx = new InitialContext(properties);
只需指定InitialContext的URL,这应该可以解决问题。