2

我是 EJB3 的新手,在访问作为 ejb 模块部署在 ear 文件中的 @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 是关于什么的,如果那是正确的路径。

如果我在 jboss 中将 LimaBean 部署为 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>

如果我触摸了soup.ear,在JBoss 启动后它会正常部署,所以我假设我需要像上面的文章所说的那样指定一个依赖项。

但即使在它部署之后,我在访问远程 LimaBean 时也会出现错误:

原因:java.lang.IllegalArgumentException:无法在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146) 在 sun.reflect.UnsafeFieldAccessorImpl 处将 com.soup.LimaBean 字段 com.soup.Soup.limaBean 设置为 $Proxy147。 throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150) at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63) at java.lang.reflect.Field.set(Field.java:657) at org.jboss.injection.JndiFieldInjector.inject (JndiFieldInjector.java:115) ... 49 更多

我已经尝试了一些事情,但是,如果有人能指出我正确的方向,我将不胜感激。

4

1 回答 1

2

由于我们设置了耳朵隔离,因此看起来需要将 JNDI 属性设置为应用服务器之外的远程客户端。

    properties.put(Context.PROVIDER_URL, url);
    InitialContext ctx = new InitialContext(properties);

只需指定 InitialContext 的 URL,就可以解决问题。

于 2009-06-26T19:28:27.330 回答