5.12. 迁移 Jakarta Enterprise Beans 客户端代码


注意

JBoss EAP 7 不支持企业实体 Bean。有关如何将实体 Bean 迁移到 Jakarta Persistence 的信息,请参阅将 实体 Beans 迁移到 Jakarta Persistence

JBoss EAP 7 中更改了默认远程连接器和端口。有关此更改的详情,请参阅更新远程 URL Connector 和端口

如果您使用 migrate 操作来迁移服务器配置,则会保留旧的设置,您不需要在此处进行更改。但是,如果您使用新的 JBoss EAP 7 默认配置,您必须进行以下更改:

5.12.1.1. 更新默认远程连接端口

jboss-ejb-client.properties 文件中,将远程连接端口值从 4447 更改为 8080。以下是前面和当前版本的 jboss-ejb-client.properties 文件示例:

示例:JBoss EAP 6 jboss-ejb-client.properties 文件

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port=4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
Copy to Clipboard Toggle word wrap

示例:JBoss EAP 7 jboss-ejb-client.properties 文件

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port=8080
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
Copy to Clipboard Toggle word wrap

5.12.1.2. 更新默认连接器

如果您使用新的 JBoss EAP 7 配置,默认的连接器已从 远程 改为 http-remoting。这个变化会影响使用 JBoss EAP 的一个发行版本的库连接到不同版本中的服务器。

  • 如果客户端应用使用 JBoss EAP 6 中的 Jakarta Enterprise Beans 客户端库,并且想连接到 JBoss EAP 7 服务器,则必须将服务器配置为在端口 8080 之外的端口上公开 远程 连接器。然后,客户端必须使用那个新配置的连接器进行连接。
  • 使用 JBoss EAP 7 的 Jakarta Enterprise Beans 客户端库的客户端应用程序,希望连接到 JBoss EAP 6 服务器,必须清楚服务器实例不使用 http-remoting 连接器,而是使用 远程 连接器。这可以通过定义新的客户端连接属性来实现。

    示例: 远程连接 属性

    remote.connection.default.protocol=remote
    Copy to Clipboard Toggle word wrap

5.12.2. 迁移远程命名客户端代码

如果您使用新的默认 JBoss EAP 7 配置运行,您必须修改客户端代码,以使用新的默认远程端口和连接器。

以下是如何在 JBoss EAP 6 中客户端代码指定远程命名属性的示例。

java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory
java.naming.provider.url=remote://localhost:4447
Copy to Clipboard Toggle word wrap

以下示例说明了如何在 JBoss EAP 7 中指定客户端代码中的远程命名属性。

java.naming.factory.initial=org.wildfly.naming.client.WildFlyInitialContextFactory
java.naming.provider.url=http-remoting://localhost:8080
Copy to Clipboard Toggle word wrap

虽然 JBoss EAP 7.0 由 JBoss EJB 客户端 2.1.4 提供,但 JBoss EAP 7.1 及更新版本随 JBoss EJB 客户端 4.0.x 一起提供,但包括了对 API 的一些更改。

注意

JBoss EAP 7 不支持企业实体 Bean。有关如何将实体 Bean 迁移到 Jakarta Persistence 的信息,请参阅将 实体 Beans 迁移到 Jakarta Persistence

  • org.ejb.client.ejbClientInvocationContext 类已添加以下新方法:

    Expand
    方法类型描述

    isBlockingCaller()

    布尔值

    确定此调用当前是否阻止调用线程。

    isClientAsync()

    布尔值

    确定方法是否标记为客户端,这意味着无论服务器端的方法是否是异步的,调用也应该是异步的。

    isIdempotent()

    布尔值

    确定该方法是否标记为 idempotent,这意味着可以多次调用方法而不产生额外的效果。

    setBlockingCaller(boolean)

    void

    建立此调用当前是否阻止调用线程。

    setLocator(EJBLocator<T>)

    <T> void

    为调用目标设置 locator。

  • org.ejb.client.ejbLocator 类添加了以下新方法:

    Expand
    方法类型描述

    asStateful()

    StatefulEJBLocator<T>

    将此 locator 返回为有状态的 locator(如果是)。

    asStateless()

    StatelessEJBLocator<T>

    将此 locator 返回为无状态的 locator(如果是)。

    isEntity()

    布尔值

    确定这是否是实体 locator。

    isHome()

    布尔值

    确定这是否是家 locator。

    isStateful()

    布尔值

    确定这是否是状态 locator。

    isStateless()

    布尔值

    确定这是否是无状态 locator。

    withNewAffinity(Affinity)

    abstract EJBLocator<T>

    创建这个 locator 的一个副本,但具有新的给定关联性。

  • 引入了一个新的 org.ejb.client.ejbClientPermission 类,它是 java.security.Permission 的子类,用于控制对特权 EJB 操作的访问。它提供以下构造器:

    • EJBClientPermission(String name)
    • EJBClientPermission(字符串名称,字符串操作)
  • 它提供以下方法:

    Expand
    方法类型描述

    equals(EJBClientPermission obj)

    布尔值

    检查两个 EJBClientPermission 对象是否相等。

    equals(Object obj)

    布尔值

    检查两个 Permission 对象是否相等。

    等于(权限 obj)

    布尔值

    检查两个 Permission 对象是否相等。

    getActions()

    字符串

    以字符串形式返回操作。

    hashcode()

    int

    返回此 Permission 对象的散列代码值。

    表示(EJBClientPermission)

    布尔值

    检查指定权限的行为是否由 EJBClientPermission 对象的行为决定

    表示(权限)

    布尔值

    Permission 对象的操作是否 暗示 了指定权限的操作。

  • 引进了一个新的 org.ejb.client.ejbMethodLocator 类,以查找特定的 EJB 方法。它提供以下构造器:

    • EJBMethodLocator(String methodName, String…​ parameterTypeNames)
  • 它提供以下方法:

    Expand
    方法类型描述

    等于(EJBMethodLocator 其他)

    布尔值

    确定此对象是否等于另一个对象。

    等于(其他对象)

    布尔值

    确定此对象是否等于另一个对象。

    forMethod(Method 方法)

    静态 EJBMethodLocator

    获取给定反射方法的方法定位器。

    getMethodName()

    字符串

    获取方法名称。

    getParameterCount()

    int

    获取参数数。

    getParameterTypeName(int index)

    字符串

    获取给定索引中的参数名称。

    hashCode()

    int

    获取哈希代码。

  • 在故障情况下,引入了一个新的 org.jboss.ejb.client.ejbReceiverInvocationContext.ResultProducer.Failed 类。它提供以下构造器:

    • failed(Exception 原因)
  • 它提供以下方法:

    Expand
    方法类型描述

    discardResult()

    void

    丢弃结果,表示将不会使用。

    getResult()

    对象

    获取结果。

  • 引进了一个新的 org.jboss.ejb.client.ejbReceiverInvocationContext.ResultProducer.Immediate 类来获取即时结果。它提供以下构造器:

    • failed(Exception 原因)
  • 它提供以下方法:

    Expand
    方法类型描述

    discardResult()

    void

    丢弃结果,表示将不会使用。

    getResult()

    对象

    获取结果。

  • 针对 URI 关联性规格引入了一个新的 org.jboss.ejb.client.URIAffinity 类,它是 org.jboss.ejb.client.Affinity 的子类。它使用 Affinity.forUri(URI) 创建。
  • 它提供以下方法:

    Expand
    方法类型描述

    等于(关联性其他)

    布尔值

    指明另一个对象是否等于这个对象。

    等于(其他对象)

    布尔值

    指明另一个对象是否等于这个对象。

    等于(URIAffinity 其他)

    布尔值

    指明另一个对象是否等于这个对象。

    getURI()

    URI

    获取关联的 URI。

    hashCode()

    int

    获取哈希代码。

    toString()

    字符串

    返回对象的字符串表示。

  • org.jboss.ejb.client.ejbMetaDataImpl 类已弃用:

    • toAbstractEJBMetaData()
    • EJBMetaDataImpl(AbstractEJBMetaData<?,?>)

5.12.4. JBoss EAP 7 所需的 EJB 客户端更改

在 JBoss EAP 7.2 中,将 org.apache.santuario.xmlsec 模块从 2.0.8 升级到 2.1.1 会导致对 PicketLinkSTS 中的 remoting 进行回归。作为以下运行时例外,问题清单本身:

java.lang.IllegalArgumentException: ELY05131: Invalid ASCII control "0xA"
Copy to Clipboard Toggle word wrap

这是因为断言中生成的 SignatureValue 中的格式化更改导致。在以前的版本中,生成的值类似如下:

<dsig:SignatureValue xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">cUNpFJIZlLYrBDZtQSTDrq2K6PbnAHyg2qbx/D5FuB4XMjdQ5oxQjkMejLyelnA7s4GFusoLhahlqlTOT8UrOyxrR4yYAmJ/e5s+f4gys926+tbiraT/3/wG8wM/Lvcjvk5Ap69zODuRYpypsWfA4jrI7TTBXVPGy8g4KUdnFviUiTuFTc2Ghgxp53AmUuLis/THyP28jE7+28//q8bi/bQrFwHC6tWX67+NK1duFCOcQ6IPIKeVrePZz55Ivgl+WWdkF6uYCz5IdMzurhzmeQ3K8DAMIxz/MG67VWJIOnuGNWF7nmdye5zd9AFcRsr1XadvZJCbGNfuc89AL5inCg==</dsig:SignatureValue>
Copy to Clipboard Toggle word wrap

在 JBoss EAP 7.2 中,生成的字符串值现在包含无效隐藏 ASCII 0xD carriage 返回和 0xA 行源控制字符的实例。

<dsig:SignatureValue xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">cUNpFJIZlLYrBDZtQSTDrq2K6PbnAHyg2qbx/D5FuB4XMjdQ5oxQjkMejLyelnA7s4GFusoLhahl&#13;
qlTOT8UrOyxrR4yYAmJ/e5s+f4gys926+tbiraT/3/wG8wM/Lvcjvk5Ap69zODuRYpypsWfA4jrI&#13;
7TTBXVPGy8g4KUdnFviUiTuFTc2Ghgxp53AmUuLis/THyP28jE7+28//q8bi/bQrFwHC6tWX67+N&#13;
K1duFCOcQ6IPIKeVrePZz55Ivgl+WWdkF6uYCz5IdMzurhzmeQ3K8DAMIxz/MG67VWJIOnuGNWF7&#13;
nmdye5zd9AFcRsr1XadvZJCbGNfuc89AL5inCg==</dsig:SignatureValue>
Copy to Clipboard Toggle word wrap

如果您遇到描述的运行时异常,请更新您的客户端代码,从返回的断言字符串中删除隐藏的 ASCII 字符。例如,假设您的当前代码类似以下示例:

WSTrustClient client = new WSTrustClient("PicketLinkSTS", "PicketLinkSTSPort",
                "http://localhost:8080/picketlink-sts/PicketLinkSTS", new WSTrustClient.SecurityInfo(username, password));
Element assertion = client.issueToken(SAMLUtil.SAML2_TOKEN_TYPE);

// Return the assertion as a string
String assertionString = DocumentUtil.getNodeAsString(assertion);
...
properties.put("remote.connection.main.password", assertionString);
Copy to Clipboard Toggle word wrap

您必须添加一个代码行,以删除无效隐藏的 ASCII 0xD carriage 返回和 0xA 行源字符的发生次数;例如:

WSTrustClient client = new WSTrustClient("PicketLinkSTS", "PicketLinkSTSPort",
                "http://localhost:8080/picketlink-sts/PicketLinkSTS", new WSTrustClient.SecurityInfo(username, password));
Element assertion = client.issueToken(SAMLUtil.SAML2_TOKEN_TYPE);

// Return the assertion as a string, stripping the invalid hidden ASCII characters
String assertionString = DocumentUtil.getNodeAsString(assertion).replace(String.valueOf((char) 0xA), "").replace(String.valueOf((char) 0xD), "");
...
properties.put("remote.connection.main.password", assertionString);
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat