【问题标题】:jndi binding for local and remote stateless bean本地和远程无状态 bean 的 jndi 绑定
【发布时间】:2013-05-31 05:40:58
【问题描述】:

我正在尝试使用远程和本地接口实现 EJB3 无状态,问题是本地接口在另一个远程 EJB 中调用,注释为 @EJB,但它返回 null 或 ClassCastException (java.lang.ClassCastException: com.sun.proxy.$Proxy58 cannot be cast) .

要在服务器上执行查找以获取本地无状态,我必须为无状态输入 2 个 JNDI 名称,否则它会为我提供远程名称。

@Stateless(mappedName=IRemoteInterface.JNDI_NAME, description="...")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
@Interceptors({GenericInvocationHandler.class})
@Remote(IRemoteInterface.class)
@Local(ILocalInterface.class)
public class MystatelessBean extends AbstractBasicBean implements 
    IRemoteInterface, ILocalInterface {
   ...
}

@Stateless(mappedName=IRouting.JNDI_NAME, description="gives access to other services")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
@Interceptors({GenericInvocationHandler.class})
@Remote(IRouting.class)
public class RoutingServiceBean extends AbstractBasicBean implements IRouting {

    @EJB
    public ILocalInterface iLocalInterface;

}

实际上,当我使用@EJB 时,我得到NPE,当我使用@EJB(beanName=IRemoteInterface.JNDI_NAME) 时,我得到ClassCastException,这是远程接口的正确JNDI 名称。

我正在 JBoss 中寻找 @LocalBinding@RemoteBinding 之类的东西。

也许我错过了什么?

【问题讨论】:

  • 由于答案似乎不起作用-您是如何解决的?谢谢
  • 我真的不明白你为什么要发布同一个 EJB 的 @Remote@Local

标签: java jakarta-ee ejb-3.0 jndi stateless-session-bean


【解决方案1】:
  1. 如果您使用 EJB3.0,您可以在 JBoss 中使用 @Localbinding / @Remotebinding。如果您使用 EJB 3.1,则 JNDI 绑定是标准化的(称为可移植全局 JNDI 名称)。

  2. @Stateless/@Stateful 注解的name 属性定义了 bean 的名称。默认是不合格的类名。

  3. @Stateless/@Stateful 注解的mappedName 属性用于将 bean 映射到 JNDI 名称。如果提供此属性,则需要提供@EJB 注释的mappedName 属性才能引用该bean。在映射方面:

    @Stateless(name="Bar")       => @EJB(beanName="Bar")
    @Stateless(mappedName="Foo") => @EJB(mappedName="Foo")
    

在您的示例中,尝试使用:

public class RoutingServiceBean {
    ...
    @EJB(mappedName=IRemoteInterface.JNDI_NAME)
    public ILocalInterface iLocalInterface;
}

【讨论】:

  • 您好 Simon,感谢您的回答,但问题是您无法将远程转换为本地,我想要的是同时使用本地和远程 bean,我认为应用程序服务器是如果调用在同一个 JVM 中,则在远程使用本地 bean 时没有足够的智能。我发现一个不好的解决方案是不修复bean的名称,并从AS的jndi中重新转换它们,然后使用这些名称来调用远程或本地bean。
【解决方案2】:

如果您使用的是 JBOSS,您可以使用注释指定本地和远程接口的 JNDI 名称。

@Stateless(mappedName=IRemoteInterface.JNDI_NAME, description="...")
@LocalBinding(jndiBinding = ILocalInterface.JNDI_NAME)
@Local(ILocalInterface.class)
@Remote(IRemoteInterface.class)
public class MystatelessBean extends AbstractBasicBean implements IRemoteInterface, ILocalInterface{
...
}

@Stateless()
@LocalBinding(jndiBinding = ILocalInterface.JNDI_NAME)
@RemoteBinding(jndiBinding = IRemoteInterface.JNDI_NAME)
@Local(ILocalInterface.class)
@Remote(IRemoteInterface.class)
public class MystatelessBean extends AbstractBasicBean implements IRemoteInterface, ILocalInterface{
...
}

请注意,可以使用 Stateless 或 RemoteBinding 注释定义远程 JNDI 名称。 RemoteBinding 和 LocalBinding 注释是特定于 JBOSS 的,可以在 jboss-ejb3-ext-api.jar 中找到。

【讨论】:

  • 从 JBoss AS 7(或企业 JBoss EAP 6)开始,annotationsXML configuration 不再允许将 EJB 绑定到自定义 JNDI 名称。因此,您对@LocalBinding@RemoteBinding 的引用都应该修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 2011-07-08
  • 2021-02-22
相关资源
最近更新 更多