【问题标题】:How to deploy EJB 3.0 application in Wildfly 8 application server如何在 Wildfly 8 应用服务器中部署 EJB 3.0 应用程序
【发布时间】:2015-02-25 11:04:37
【问题描述】:

我正在将 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.那么我将如何在 wildfly 中使用 standalone.xml / ejb-jar.xml / any other configuration 做同样的事情。

我尝试关注博客:JBoss: Binding values into JNDI in JBoss EAP 6 similar to JNDIBindingServiceMgr 但无法链接我尝试根据 jndi 名称查找 EJB bean 但没有工作的位置。

请帮忙。非常感谢。

【问题讨论】:

    标签: java ejb-3.0 wildfly-8 ejb-3.2


    【解决方案1】:

    用@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:global///

    例如,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>
    

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

    &lt;uri&gt;my-ejbs.jar&lt;/uri&gt; 将删除我的 ejb 模块的版本,因此它不会反映在 JNDI 路径中。

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

    如果你想从应用服务器外部访问bean,你必须使用以java:jboss/exported开头的JNDI路径

    【讨论】:

    • 非常感谢.. deleze。是否可以在 wildfly 中配置 JNDI 名称,如下所示:1)在 EJB bean 中定义 @LocalBinding(jndiBinding="sample/student") 和 2)使用定义的 JNDI 名称进行查找,如 Context c = new InitialContext(); studentlBean = (studentlBean) c.lookup("sample/student");
    猜你喜欢
    • 2020-02-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多