同一EJB的多个名称

时间:2013-10-09 09:54:25

标签: ejb jndi naming

我可以使用多个名称以类似的方式部署EJB,因为在Spring中可以使用名称别名吗?

2 个答案:

答案 0 :(得分:0)

根据EJB 3.0规范:

在宣布时间:

命名

注释元素名称定义bean“name”,默认为bean类的非限定名称。 bean名称在包含EJB的模块范围内必须是唯一的。

引用EJB:

<强> beanName

beanName元素通过name元素或部署描述符中的元素指定在@Stateful和@Stateless注释中声明的bean“name”。当多个EJB在应用程序中实现相同的业务接口时,beanName元素最有用:beanName允许开发人员引用特定模块中的特定EJB

所以,是的,你可以,但ejb必须打包在不同的模块中,然后通过beanName指向它。

不是春天。 ,可能有各种方法,但这是供应商特定的,不是便携式的。

答案 1 :(得分:0)

是的,可以使用ejb-jar.xml描述符在多个名称或别名下部署相同的EJB。

此外,将考虑EJB xml描述符中定义的名称和注释中定义的名称(尽管出于可移植性原因,我不会冒险在xml描述符和注释之间混合)。

此示例适用于JBoss AS 7.1.1.Final:

@Local
public interface PingWorker {
    String ping(String name);
} 

@Stateless(name = "PingAlias")  // first name
public class PingWorkerBean implements PingWorker {
    @Override
    public String ping(String name) {
        return "Hello " + name;
    }
}

<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0">
    <enterprise-beans>
        <session>
            <ejb-name>PingWorker</ejb-name>  <!-- second name -->
            <ejb-class>com.xyz.service.PingWorkerBean</ejb-class>
            <session-type>Stateless</session-type>
        </session>
        <session>
            <ejb-name>PingProcessor</ejb-name>  <!-- third name -->
            <ejb-class>com.xyz.service.PingWorkerBean</ejb-class>
            <session-type>Stateless</session-type>
        </session>
    </enterprise-beans>
</ejb-jar>

在引用组件中,您可以声明:

@Stateless
public class PingBean implements Ping {

    @EJB(beanName = "PingAlias")
    private PingWorker pingWorkerByAnnotaion;

    @EJB(beanName = "PingWorker")
    private PingWorker pingWorkerByDescriptorOne;

    @EJB(beanName = "PingProcessor")
    private PingWorker pingWorkerByDescriptorTwo;

}

并且应该满足所有三个参考。在部署时,部署了三个EJB,这些EJB公开了相同的接口和实现,但具有不同的名称:

java:global/ear-app-1/ejb-1/PingProcessor!com.xyz.service.PingWorker
java:app/ejb-1/PingProcessor!com.xyz.service.PingWorker
java:module/PingProcessor!com.xyz.service.PingWorker
java:global/ear-app-1/ejb-1/PingProcessor
java:app/ejb-1/PingProcessor
java:module/PingProcessor

java:global/ear-app-1/ejb-1/PingAlias!com.xyz.service.PingWorker
java:app/ejb-1/PingAlias!com.xyz.service.PingWorker
java:module/PingAlias!com.xyz.service.PingWorker
java:global/ear-app-1/ejb-1/PingAlias
java:app/ejb-1/PingAlias
java:module/PingAlias

java:global/ear-app-1/ejb-1/PingWorker!com.xyz.service.PingWorker
java:app/ejb-1/PingWorker!com.xyz.service.PingWorker
java:module/PingWorker!com.xyz.service.PingWorker
java:global/ear-app-1/ejb-1/PingWorker
java:app/ejb-1/PingWorker
java:module/PingWorker

正如您可能看到的,这与Spring中的别名不同。而在Spring中,别名只是引用相同实例或实例集的不同名称(取决于范围) - 在EJB中,您需要多次声明EJB。在EJB容器中,这些在实例池等方面成为单独的EJB。

根据您要实现的目标 - 您还可以考虑在引用EJB时​​覆盖引用的EJB名称(使用描述符beanName覆盖注释<ejb-link/>)。更多相关信息: Choose EJB to be injected without recompiling