如何在Wildfly 8应用服务器中部署EJB 3.0应用

How to deploy EJB 3.0 application in Wildfly 8 application server

我正在将 EJB 3.0 应用程序从 jboss AS 6 迁移到 Wildfly AS 8。

是否可以像在 wildfly 中一样轻松地将 EJB 3.0 应用程序部署到 wildfly?根据 pom.xml 中的 wildfly EJB 模块更新 EJB 规范后,我收到编译错误,因为相关 API 在 wildfly 中不可用,所以找不到以下符号。

org.jboss.ejb3.annotation.LocalBinding;
org.jboss.ejb3.annotation.Depends;
org.jboss.ejb3.annotation.Management;
org.jboss.ejb3.annotation.Service;

以上注释在jboss-ejb3-ext-api.jar中找到,它是jBoss 6 AS的一部分。

javax.annotation.security.PermitAll

以上注释在jboss-annotations-api_1.1_spec.jar中找到,它是jBoss 6 AS的一部分。

从文档中,我了解到 wildfly 支持 EJB3.2 而 EJB3.2 不支持 @LocalBinding / @RemoteBinding.那么我将如何使用 standalone.xml / ejb-jar.xml / any other configuration 在 wildfly 中做同样的事情。

我尝试关注博客:JBoss: Binding values into JNDI in JBoss EAP 6 similar to JNDIBindingServiceMgr 但无法 link 我尝试根据 jndi 名称查找 EJB bean 但没有成功。

请帮忙。非常感谢。

用@Remote 和/或@Local 注释你的bean 接口。 用 @Stateless.

注释你的 bean 实现

使用 maven 构建项目以生成 EJB JAR 和客户端 JAR(如果在 EAR 外部使用,则排除服务器实现)。

<build>
    <plugins>
        <!-- maven-ejb-plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-ejb-plugin</artifactId>
            <configuration>
                <clientExcludes>
                    <clientExclude>**/ejb/*</clientExclude>
                </clientExcludes>
            </configuration>
        </plugin>
    </plugins>
</build>

将 EJB 打包到 EAR 中。 (这是可选的,但我将 Web 模块部署为一个 .ear 文件)。

为了能够知道你的EJB的JNDI名称,Wildfly遵循标准的命名约定。 `java:全局///

例如 ear 具有名称 my-ear、ejb 名称 my-ejbs 和 bean 接口 a.b.c.MyBeanRemote 以及实现 a.b.c.ejb.MyBean:远程 JNDI 路径将为 java:global/my-ear/my-ejbs/MyBean 或更详细的 java:global/my-ear/my-ejbs/MyBean!a.b.c.MyBeanRemote.

为了生成这种部署结构,我在我的 ear 项目中使用了以下配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-ear-plugin</artifactId>
            <configuration>
                <version>7</version>
                <applicationId>my-ear</applicationId>
                <applicationName>my-ear</applicationName>
                <defaultLibBundleDir>/lib</defaultLibBundleDir>
                <jboss>
                    <version>5</version>
                    <unauthenticated-principal>guest</unauthenticated-principal>
                    <security-domain>ABC</security-domain>
                </jboss>
                <modules>
                    <webModule>
                        <groupId>a.b.c.my-group</groupId>
                        <artifactId>my-web-app</artifactId>
                        <uri>my-web-app.war</uri>
                        <contextRoot>/my-web-app</contextRoot>
                    </webModule>
                    <ejbModule>
                        <groupId>a.b.c.my-group</groupId>
                        <artifactId>my-ejbs</artifactId>
                        <uri>my-ejbs.jar</uri>
                    </ejbModule>
                </modules>
            </configuration>
        </plugin>
    </plugins>
</build>

<applicationName>my-ear</applicationName> 将设置我的应用程序 EAR 使用的正确名称(没有版本)。

<uri>my-ejbs.jar</uri> 会删除我的 ejb 模块的版本,因此不会反映在 JNDI 路径中。

提示:部署 EAR 时,您的 bean 的 JNDI 名称会打印在日志文件中。

如果要从应用服务器外部访问bean,必须使用以java:jboss/exported

开头的JNDI路径