4

我正在尝试使用远程和本地接口实现 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 名称。

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

也许我错过了什么?

4

2 回答 2

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

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

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

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

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

public class RoutingServiceBean {
    ...
    @EJB(mappedName=IRemoteInterface.JNDI_NAME)
    public ILocalInterface iLocalInterface;
}
于 2013-06-20T14:46:28.497 回答
0

如果您使用 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 中找到。

于 2015-01-28T18:20:52.370 回答