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し、使用すると、リモート インターフェイスの正しい JNDI 名が取得されます@EJB(beanName=IRemoteInterface.JNDI_NAME)ClassCastException

JBoss で@LocalBindingandのようなものを探しています。@RemoteBinding

多分私は何かを逃していますか?

4

2 に答える 2

2
  1. EJB3.0 を使用している場合は、JBoss で@Localbinding/を使用できます。@RemotebindingEJB 3.1 を使用する場合、JNDI バインディングは標準化されています (ポータブル グローバル JNDI 名と呼ばれます)。

  2. name@Stateless/アノテーションの属性は@Stateful、Bean の名前を定義します。デフォルトは非修飾クラス名です。

  3. mappedName@Stateless/@Statefulアノテーションの属性は、Bean を JNDI 名にマップするために使用されます。この属性を指定する場合は、Bean を参照するためにアノテーションのmappedName属性を指定する必要があります。@EJBマッピングに関して:

    @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{
...
}

リモート JNDI 名は、Stateless アノテーションまたは RemoteBinding アノテーションのいずれかで定義できることに注意してください。RemoteBinding および LocalBinding アノテーションは JBOSS 固有であり、jboss-ejb3-ext-api.jar にあります。

于 2015-01-28T18:20:52.370 に答える