WildFly:如何从位于另一个应用程序中的 EJB 调用 EJB

article/2025/9/12 11:15:12

目录

创建 EJB 服务器项目

配置服务器依赖项(WildFly 18 及更高版本)

配置服务器依赖项(WildFly 11、12、13、14、15、16、17)

部署 EJB 服务器项目

创建 EJB 客户端项目

配置客户端依赖项(WildFly 18 及更高版本)

在 EJB 客户端项目中配置安全性

测试 EJB 客户端项目


本教程的目的是演示如何从位于另一个应用程序中的另一个EJB查找和调用部署在WildFly服务器实例上的EJB 。

这是我们的场景:

另一方面,如果您的场景需要从独立的远程客户端调用 EJB,请查看本教程:WildFly 远程 EJB 客户端教程

为了演示如何从远程 EJB 客户端调用 EJB,我们需要完成以下步骤:

  • 创建 EJB 服务器项目,其中包含 EJB 的接口和实现
  • 创建查找远程 EJB的 EJB 客户端项目
  • 在客户端项目中配置安全性,使其有权调用远程 EJB

创建 EJB 服务器项目

因此,假设您有一个简单的服务器项目,其中包括以下有状态和无状态 EJB:

package com.mastertheboss.ejb;import javax.ejb.Remote;
import javax.ejb.Stateful;
import com.mastertheboss.exception.InsufficientFundsException;@Stateful
@Remote(Account.class)
public class AccountEJB implements Account {long money;@Overridepublic long getMoney() {return money;}public void createAccount(long amount)  {this.money= amount;}@Overridepublic void deposit(long amount)  {this.money+= amount;System.out.println("Money deposit. total is "+money);}@Overridepublic void withdraw(long amount) throws InsufficientFundsException {long newAmount = money - amount;if (newAmount < 0) {throw new InsufficientFundsException("Unsufficient funds for account! ");}money = newAmount;     System.out.println("Money withdrawal. total is "+money);}
}package com.mastertheboss.ejb;import javax.ejb.Remote;
import javax.ejb.Stateless;@Stateless
@Remote(Calculator.class)
public class CalculatorEJB implements Calculator {float interest=5;@Overridepublic float calculateInterest(long money) {return money * (1+ (interest/100));}}

这两个类的接口是:

package com.mastertheboss.ejb;import com.mastertheboss.exception.InsufficientFundsException;public interface Account {public void deposit(long amount);public void withdraw(long amount) throws InsufficientFundsException;public long getMoney();public void createAccount(long amount);
}package com.mastertheboss.ejb;public interface Calculator {public float calculateInterest(long money);}

配置服务器依赖项(WildFly 18 及更高版本)

服务器项目需要以下一组依赖项:

<dependencyManagement><dependencies><dependency><groupId>org.wildfly.bom</groupId><artifactId>wildfly-jakartaee8-with-tools</artifactId><version>${version.server.bom}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
<dependencies><dependency><groupId>org.jboss.spec.javax.annotation</groupId><artifactId>jboss-annotations-api_1.3_spec</artifactId><scope>provided</scope></dependency><dependency><groupId>org.jboss.spec.javax.ejb</groupId><artifactId>jboss-ejb-api_3.2_spec</artifactId><scope>provided</scope></dependency>
</dependencies>

属性version.server.bom包含应用程序服务器版本,例如:

<properties><version.server.bom>18.0.0.Final</version.server.bom>
</properties>

配置服务器依赖项(WildFly 11、12、13、14、15、16、17)

如果您的 WildFly 版本仍未通过 Jakarta EE 认证,那么您需要应用的唯一更改是您的 BOM,这将是用于服务器和客户端应用程序的wildfly-javaee8-with-tools 。无需其他更改:

<dependencyManagement><dependencies><dependency><groupId>org.wildfly.bom</groupId><artifactId>wildfly-javaee8-with-tools</artifactId><version>${version.server.bom}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

部署 EJB 服务器项目

由于我们的 pom.xml 包含 WildFly 的 maven 插件,您可以简单地构建和部署 EJB Server 项目,如下所示:

mvn install wildfly:deploy

从服务器日志中检查 EJB 项目已部署并且 JNDI 绑定可用:

08:24:43,534 INFO  [org.jboss.as.ejb3.deployment] (MSC service thread 1-3) WFLYEJB0473: JNDI bindings for session bean named 'AccountEJB' in deployment unit 'deployment "ejb-client-basic.war"' are as follows:java:global/ejb-client-basic/AccountEJB!com.mastertheboss.ejb.Accountjava:app/ejb-client-basic/AccountEJB!com.mastertheboss.ejb.Accountjava:module/AccountEJB!com.mastertheboss.ejb.Accountjava:jboss/exported/ejb-client-basic/AccountEJB!com.mastertheboss.ejb.Accountejb:/ejb-client-basic/AccountEJB!com.mastertheboss.ejb.Account?statefuljava:global/ejb-client-basic/AccountEJBjava:app/ejb-client-basic/AccountEJBjava:module/AccountEJB

创建 EJB 客户端项目

现在让我们编写一个 EJB 客户端应用程序。为了简单起见,我们的应用程序将仅由一个 Servlet FE 和一个调用 Account 和 Calculator EJB 的 EJB 组成。这是Servlet:

package com.mastertheboss.ejbclient;import java.io.IOException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ejb.*;@WebServlet(urlPatterns = "/ejbclient")
public class ServletFE extends HttpServlet {@EJB EJBClient ejb;protected void doGet(HttpServletRequest request, HttpServletResponse response) {response.setContentType("html");write(response, "Example Servlet to show how EJB can invoke an EJB in another application");try {long money= request.getParameter("money") != null ? Long.parseLong(request.getParameter("money")) : 100l;float moneyWithInterest = ejb.callRemoteEJBs(money);write(response, "Amount: " + moneyWithInterest);} catch (Exception n) {write(response, "Failed to invoke Remote EJB");write(response, n.getMessage());}}private static void write(HttpServletResponse writer, String message) {try {writer.getWriter().write(message + "\n");} catch (IOException e) {e.printStackTrace();}}}

如您所见,它只是我们 EJB 的一个小包装器,其中包含实际的 EJB 客户端交互:

package com.mastertheboss.ejbclient;import java.util.Hashtable;import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;import com.mastertheboss.ejb.*;
import com.mastertheboss.exception.*;import javax.naming.spi.NamingManager;
import javax.ejb.*;
@Stateless
public class EJBClient {@EJB(name="ejb:/ejb-server-basic/CalculatorEJB!com.mastertheboss.ejb.Calculator")Calculator calculator;@EJB(name="ejb:/ejb-server-basic/AccountEJB!com.mastertheboss.ejb.Account?stateful")Account account;public float callRemoteEJBs(long money) throws Exception {account.createAccount(money);System.out.println("Create Account with "+money);account.deposit(money/2);System.out.println("Deposit " +(money/2));try {account.withdraw(money/3);System.out.println("Withdraw "+(money/3));} catch (InsufficientFundsException e) {e.printStackTrace();}money = account.getMoney();System.out.println("Money left " + money);float totalMoney = calculator.calculateInterest(money);System.out.println("Money plus interests " + totalMoney);return totalMoney;}
}

请注意,由于我们将调用驻留在同一应用程序服务器中的 EJB,因此查找远程 EJB 所需的只是以下内容:

@EJB(name="ejb:/ejb-server-basic/CalculatorEJB!com.mastertheboss.ejb.Calculator")
Calculator calculator;@EJB(name="ejb:/ejb-server-basic/AccountEJB!com.mastertheboss.ejb.Account?stateful")
Account account;

配置客户端依赖项(WildFly 18 及更高版本)

服务器项目需要以下一组依赖项:

<dependencyManagement><dependencies><dependency><groupId>org.wildfly.bom</groupId><artifactId>wildfly-jakartaee8-with-tools</artifactId><version>${version.server.bom}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
<dependencies>
<!-- We depend on the EJB remote business interfaces of this application --><dependency><groupId>com.itbuzzpress.chapter4</groupId><artifactId>ejb-server-basic</artifactId><type>ejb-client</type><version>${project.version}</version></dependency>
<!-- Include the ejb client jars --><dependency><groupId>org.wildfly</groupId><artifactId>wildfly-ejb-client-bom</artifactId><type>pom</type><scope>compile</scope></dependency>
</dependencies>

与此类似,Property version.server.bom包含 Application Server 版本,例如:

<properties><version.server.bom>18.0.0.Final</version.server.bom>
</properties>

至于 EJB 服务器项目,如果您在 WildFly 11 和 WildFly 17 之间运行 WildFly 版本,请在您的依赖项管理部分中使用 artifactId wildfly-javaee8-with-tools 。

在 EJB 客户端项目中配置安全性

影响您的客户端的另一个更改是以前的jboss-ejb-client.properties文件已被弃用,因此我们鼓励您迁移到 Elytron wildfly-config.xml文件,该文件将所有客户端配置统一在一个地方。出于我们示例的目的,我们将只添加一个默认的 wildfly-confug.xml 文件,该文件使用任何可用的 SASL 机制选择器进行身份验证。

<configuration><authentication-client xmlns="urn:elytron:1.0"><authentication-rules><rule use-configuration="default" /></authentication-rules><authentication-configurations><configuration name="default"><sasl-mechanism-selector selector="#ALL" /><set-mechanism-properties><property key="wildfly.sasl.local-user.quiet-auth" value="true" /></set-mechanism-properties><providers><use-service-loader/></providers></configuration></authentication-configurations></authentication-client>
</configuration>

另一方面,如果您需要提供凭据,则可以将它们添加到 authentication-configurations 块中,如下例所示:

<configuration><authentication-client xmlns="urn:elytron:1.0"><authentication-rules><rule use-configuration="default"/></authentication-rules><authentication-configurations><configuration name="default"><sasl-mechanism-selector selector="DIGEST-MD5"/><set-user-name name="ejbuser"/><credentials><clear-password password="password1!"/></credentials></configuration></authentication-configurations></authentication-client>    
</configuration>

要在服务器上创建用户,只需执行 add-user.sh 脚本,如下所示:

$ ./add-user.sh -a -u ejbuser -p password1! 

测试 EJB 客户端项目

为了测试我们的应用程序,还要部署 Client 项目:

mvn clean install wildfly:deploy

您可以通过 Servlet URI 测试应用程序,即“/ejbclient”:

curl http://localhost:8080/ejb-client-basic/ejbclient?money=200

您可以在以下位置查看本教程的源代码: https ://github.com/fmarchioni/mastertheboss/tree/master/ejb/intra-server-remote-ejb


http://chatgpt.dhexx.cn/article/UH55ClMn.shtml

相关文章

使用Eclipse+GlassFish构建简单EJB

EJB,即企业级JavaBean。它是一个标准&#xff0c;而不是一个产品。其存在的目的是为后台开发人员提供一个标准的开发标准。它主要分成SessionBean,EntityBean和MessageDrivenBean。简而言之就是**服务器端**的一个标准。 在开发中我们需要先创建一个EJB项目&#xff0c;并在此…

ejb中sessionbean的见解

EJB学习笔记五&#xff08;SessionBean的生命周期&#xff09; 1.前言 前几篇主要介绍了有状态和无状态、远程和本地调用的SessionBean&#xff0c;这篇介绍一下有关SessionBean的生命周期。SessionBean处于EJB容器管理之下&#xff0c;对于客户端来说是完全透明的。但对于开…

理解EJB

转载: EJB到底是什么&#xff0c;真的那么神秘吗 1. 我们不禁要问&#xff0c;什么是”服务集群”&#xff1f;什么是”企业级开发”&#xff1f; 既然说了EJB 是为了”服务集群”和”企业级开发”&#xff0c;那么&#xff0c;总得说说什么是所谓的”服务 集群”和”企业…

EJB的理解

百科定义EJB&#xff1a; 被称为Java企业bean&#xff0c;服务器端组件&#xff0c;核心应用是部署分布式应用程序。用它部署的系统不限定平台。实际上ejb是一种产品&#xff0c;描述了应用组件要解决的标准 标准&#xff1a; 可扩展 (Scalable)分布式 (Distributed)事务处理(T…

认识EJB

一、定义 将业务逻辑从客户端软件中抽取出来&#xff0c;封装在一个组件中。这个组件运行在一个独立的服务器上&#xff0c;客户端软件通过网络调用组件提供的服务以实现业务逻辑&#xff0c;而客户端软件的功能单纯到只负责发送调用请求和显示处理结果。在J2EE中&#xff0c;这…

EJB到底是什么,真的那么神秘吗??

前言&#xff1a;网上看到的一篇博客&#xff0c;感觉还不错&#xff0c;转载过来和大家分享一下&#xff1a; 1. 什么是"服务集群"&#xff1f;什么是"企业级开发"&#xff1f; 既然说了EJB 是为了"服务集群"和"企业级开发"&#xf…

EJB框架 详细介绍和注解的使用

一、EJB是什么&#xff1f; EJB是sun的JavaEE服务器端组件模型&#xff0c;是一种规范&#xff0c;设计目标与核心应用是部署分布式应用程序。EJB2.0过于复杂&#xff0c;EJB3.0的推出减轻了开发人员进行底层开发的工作量&#xff0c;它取消或最小化了很多(以前这些是必须实现)…

EJB到底是什么?(通俗易懂白话文)

1. 我们不禁要问&#xff0c;什么是"服务集群"&#xff1f;什么是"企业级开发"&#xff1f; 既然说了EJB 是为了"服务集群"和"企业级开发"&#xff0c;那么&#xff0c;总得说说什么是所谓的"服务 集群"和"企业级开发…

Http协议的组成

1、Http是什么 http是超文本传输协议&#xff0c;是互联网上应用最为广泛的一种网络协议。 2、Http协议的组成 Http协议是由Http请求和响应组成。当在浏览器中输入网址访问某个网站时&#xff0c;浏览器会将你的请求封装乘一个Http请求发送给服务器点&#xff0c;服务器接收到…

Http 协议, 前后端交互理解

目录 HTTP协议引入 HTTP的特征 http协议&#xff0c;以及从前后端交互角度去理解 无状态 无连接 客户端请求消息 服务器响应消息 HTTP 请求方法(常用款) HTTP 响应头信息 (常用款) HTTP 状态码 (常用款) 简单的写一个minihttp HTTP协议引入 http超文本传输协议, 是基…

HTTP协议版本检测

HTTP/2.0在2015年就已经正式发布了&#xff0c;但是现在大部分网站还在使用HTTP/1.1协议。具体怎么查看网站采用的是HTTP/1.1&#xff0c;还是HTTP/2.0呢&#xff0c;本篇就介绍几种检测HTTP协议版本的方法。 所有的操作都是基于Chrome浏览器&#xff0c;以本站 tiven.cn 为例。…

C++中的HTTP协议

1、HTTP Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;。是一种通信协议&#xff0c;它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外…

HTTP协议简单概述

学习目标 HTTP 协议概述 HTTP 请求响应 HTTP 请求方法 HTTP 响应方法 HTTP 消息报文之请求报文 HTTP 消息报文之响应报文 HTTP 消息报文之通用报文 URL ​ 我们更熟悉 URL&#xff08;Uniform Resource Locator&#xff0c;统一资源定位符&#xff09;。URL 正是使用 …

HTTP协议笔记

1、HTTP协议简介 1.1、什么是通信协议 官方理解&#xff1a;通信协议是指通信双方完成通信所必须遵守的规则和约定 通俗理解&#xff1a;通信双方采用约定好的格式来发送和接收消息&#xff0c;这种实现约定好的通信格式&#xff0c;就叫通信协议 例子&#xff1a;张三与李…

HTTP协议解析

文章目录 一、HTTP协议基础1、定义2、工作原理3、特点4、与Https的区别&#x1f435;HTTPS简介&#xff1a;两者区别&#xff1a; 二、HTTP请求协议1、HTTP请求结构&#xff1a;2、请求方法3、举例4、Post和Get的区别&#x1f308; 三、HTTP响应协议1、组成2、响应头3、状态码常…

http协议格式

文章目录 HTTP协议格式请求行首行:请求方法&#xff1a; 空行 \r\n&#xff1a;响应行首行头部&#xff1a; http协议介绍&#xff1a; HTTP 协议一般指 HTTP&#xff08;超文本传输协议&#xff09;。超文本传输协议&#xff08;英语&#xff1a;HyperText Transfer Protocol&…

HTTP协议简单解释

简单的HTTP协议主要特点HTTP之URLURI和URL的区别HTTP之请求消息Request请求方法GET和POST的区别 HTTP之响应消息ResponseHTTP之状态码COOKIE和SESSION有什么区别CookieSession HTTP1.1HTTPS浏览器中输入一个URL发生什么?参考 简单的HTTP协议 HTTP协议是Hyper Text Transfer P…

HTTP协议详细讲解(完整版)

HTTP协议 1. HTTP协议的定义 HTTP协议&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;&#xff0c;是一个客户端请求和回应的标准协议&#xff0c;这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。用户输入地址和端口号之后就可…

JavaWeb——HTTP详解

文章目录 什么是HTTPHTTP发展阶段HTTP请求1.请求行请求方式 2.消息头 HTTP响应1.响应体2.响应状态码常见状态码HTTP状态码分类HTTP状态码列表: 什么是HTTP 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#…

HTTP协议(详解)

HTTP协议&#xff08;详解&#xff09; HTTP协议&#xff1a;全称为Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;。HTTP协议是用于从&#xff08;WWW&#xff1a;World Wide Web&#xff0c;简称万维网&#xff09;服务器传输超文本到本地浏览器的传输…