jndi绑定本地和远程无状态bean

时间:2013-06-04 17:55:50

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

我正在尝试使用远程和本地接口实现EJB3无状态问题是在具有注释@EJB的其他远程EJB中调用本地问题,但它返回null或ClassCastExceptionjava.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的内容。

也许我错过了什么?

2 个答案:

答案 0 :(得分:2)

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

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

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

    @Stateless(name="Bar")       => @EJB(beanName="Bar")
    @Stateless(mappedName="Foo") => @EJB(mappedName="Foo")
    
  5. 在您的示例中,尝试使用:

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

答案 1 :(得分: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{
...
}

OR

@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中找到。