第 17 章 配置 JAX-WS 端点


摘要

JAX-WS 端点使用以下三个 Spring 配置元素之一进行配置。正确的元素取决于您配置的端点类型以及您要使用的功能。对于消费者,您使用 jaxws:client 元素。对于服务提供商,您可以使用 jaxws:endpoint 元素或 jaxws:server 元素。

用于定义端点的信息通常在端点的合同中定义。您可以使用 configuration 元素的 覆盖合同信息。您还可以使用配置元素提供合同中未提供的信息。

您必须使用配置元素来激活 WS-RM 等高级功能。这可以通过向端点配置元素提供子元素来完成。请注意,当使用 Java 优先方法处理端点时,可能会因为端点的合同缺少有关要使用的绑定和传输类型的信息。

17.1. 配置服务提供商

17.1.1. 配置服务提供商的元素

Apache CXF 有两个可用于配置服务提供商的元素:

两个元素之间的差别主要是运行时内部的。jaxws:endpoint 元素将属性注入为支持服务端点而创建的 org.apache.cxf.jaxws.EndpointImpl 对象。jaxws:server 元素将属性注入 org.apache.cxf.jaxws.support.JaxWsServerFactoryBean 对象,以便支持端点。EndpointImpl 对象将配置数据传递给 JaxWsServerFactoryBean 对象。JaxWsServerFactoryBean 对象用于创建实际的服务对象。由于任一配置元素将配置服务端点,因此您可以根据您喜欢的语法进行选择。

17.1.2. 使用 jaxws:endpoint Element

概述

jaxws:endpoint 元素是用于配置 JAX-WS 服务提供程序的默认元素。其属性和子项指定实例化服务提供商所需的所有信息。许多属性都映射到服务合同中的信息。子项用于配置拦截器和其他高级功能。

识别要配置的端点

要使运行时将配置应用到正确的服务提供商,它必须能够识别它。识别服务提供商的基本方法是指定实现端点的类。这可以通过 jaxws:endpoint 元素的 implementor 属性来完成。

对于不同端点共享一个共同实施的实例,可以为每个端点提供不同的配置。在配置中区分特定端点的方法有两种:

  • serviceName 属性和 endpointName 属性的组合

    serviceName 属性指定定义服务端点的 wsdl:service 元素。endpointName 属性指定定义服务端点的特定 wsdl:port 元素。这两个属性都使用格式 ns 指定为 QNames:名称ns 是元素的命名空间,name 是元素的 name 属性的值。

    注意

    如果 wsdl:service 元素只有一个 wsdl:port 元素,则可以省略 endpointName 属性。

  • name 属性

    name 属性指定定义服务端点的特定 wsdl:port 元素的 QName。QName 以 {ns}localPart格式提供nswsdl:port 元素的命名空间,localPartwsdl:port 元素的 name 属性的值。

属性

jaxws:endpoint 元素的属性配置端点的基本属性。这些属性包括端点的地址、实施端点的类以及托管端点的 总线

表 17.1 “使用 jaxws:endpoint Element 配置 JAX-WS 服务提供商的属性” 描述 jaxws:endpoint 元素的属性。

表 17.1. 使用 jaxws:endpoint Element 配置 JAX-WS 服务提供商的属性
属性描述

id

指定其他配置元素可用于引用端点的唯一标识符。

implementationor

指定实施该服务的类。您可以使用类名称或对配置实施类的 Spring bean 的 ID 引用来指定实施类。此类必须位于 classpath 上。

implementorClass

指定实施该服务的类。当提供给 implementor 属性的值是使用 Spring AOP 打包的 bean 的引用时,此属性很有用。

address

指定 HTTP 端点的地址。这个值会覆盖服务合同中指定的值。

wsdlLocation

指定端点的 WSDL 合同的位置。WSDL 合同的位置相对于部署该服务的文件夹。

endpointName

指定服务的 wsdl:port 元素的 name 属性的值。它使用格式 ns:name 将它指定为 QName,其中 nswsdl:port 元素的命名空间。

serviceName

指定服务的 wsdl:service 元素的 name 属性的值。它使用格式 ns:name 将它指定为 QName,其中 nswsdl:service 元素的命名空间。

publish

指定是否应自动发布该服务。如果将其设置为 false,则开发人员必须明确发布 第 31 章 发布服务 中描述的端点。

bus

指定配置用于管理服务端点总线的 Spring bean 的 ID。这在将多个端点配置为使用一组常用功能时很有用。

bindingUri

指定服务使用的消息绑定的 ID。第 23 章 Apache CXF 绑定 ID 中提供了有效绑定 ID 列表。

name

指定服务的 wsdl:port 元素的字符串指定的 QName。它使用 {ns}localPart 格式将其指定为 QName。nswsdl:port 元素的命名空间,localPartwsdl:port 元素的 name 属性的值。

abstract

指定 bean 是否为抽象 Bean。抽象 Bean 充当 concrete bean 定义的父项,且不会实例化。默认值为 false。把它设置为 true 会指示 bean 工厂不会实例化 bean。

dependent-on

指定在可以实例化前端点要实例化的 Bean 列表。

createdFromAPI

指定使用 Apache CXF API 创建的 bean 用户,如 Endpoint.publish ()Service.getPort ()

默认值为 false

把它设置为 true 执行以下操作:

  • 通过将 .jaxws-endpoint 附加到其 id 来更改 bean 的内部名称
  • 使 bean 抽象

publishedEndpointUrl

放置在生成的 WSDL 的 address 元素中的 URL。如果没有指定这个值,则使用 address 属性的值。当"public" URL 与部署该服务的 URL 不同时,此属性很有用。

除了 表 17.1 “使用 jaxws:endpoint Element 配置 JAX-WS 服务提供商的属性” 中列出的属性外,您可能需要使用多个 xmlns:shortName 属性来声明 endpointNameserviceName 属性使用的命名空间。

示例

例 17.1 “简单的 JAX-WS 端点配置” 显示 JAX-WS 端点的配置,用于指定发布端点的地址。示例假定您要将默认值用于所有其他值,或者实现已在注解中指定了值。

例 17.1. 简单的 JAX-WS 端点配置

<beans ...
  xmlns:jaxws="http://cxf.apache.org/jaxws"
  ...
  schemaLocation="...
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
    ...">
  <jaxws:endpoint id="example"
                  implementor="org.apache.cxf.example.DemoImpl"
                  address="http://localhost:8080/demo" />
</beans>

例 17.2 “使用服务名称进行 JAX-WS 端点配置” 显示 JAX-WS 端点的配置,其合同包含两个服务定义。在这种情况下,您必须使用 serviceName 属性指定要实例化哪个服务定义。

例 17.2. 使用服务名称进行 JAX-WS 端点配置

<beans ...
  xmlns:jaxws="http://cxf.apache.org/jaxws"
  ...
  schemaLocation="...
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
    ...">

  <jaxws:endpoint id="example2"
                  implementor="org.apache.cxf.example.DemoImpl"
                  serviceName="samp:demoService2"
                  xmlns:samp="http://org.apache.cxf/wsdl/example" />

</beans>

xmlns:samp 属性指定定义 WSDL 服务 元素的命名空间。

例 17.3 “启用 HTTP/2 的 JAX-WS 端点配置” 显示 JAX-WS 端点的配置,该端点指定了启用了 HTTP/2 的地址。

为 Apache CXF 配置 HTTP/2

在 Apache Karaf 上使用独立 Apache CXF Undertow 传输(http-undertow)时,支持 HTTP/2。要启用 HTTP/2 协议,您必须将 jaxws:endpoint 元素的 address 属性设置为绝对 URL,并将 org.apache.cxf.transports.http_undertow.EnableHttp2 属性设置为 true

注意

此 HTTP/2 实现只支持使用普通 HTTP 或 HTTPS 的服务器端 HTTP/2 传输。

例 17.3. 启用 HTTP/2 的 JAX-WS 端点配置

<beans ...
  xmlns:jaxws="http://cxf.apache.org/jaxws"
  ...
  schemaLocation="...
  http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
  ...">

  <cxf:bus>
    <cxf:properties>
        <entry key="org.apache.cxf.transports.http_undertow.EnableHttp2" value="true"/>
    </cxf:properties>
  </cxf:bus>

  <jaxws:endpoint id="example3"
                implementor="org.apache.cxf.example.DemoImpl"
                address="http://localhost:8080/demo" />
  </jaxws:endpoint>

</beans>
注意

为提高性能,红帽建议在 Apache Karaf (pax-web-undertow)上使用 servlet 传输,它启用了集中配置和调整 Web 容器,但 pax-web-undertow 不支持 HTTP/2 传输协议。

17.1.3. 使用 jaxws:server Element

概述

jaxws:server 元素是用于配置 JAX-WS 服务提供程序的元素。它将配置信息注入到 org.apache.cxf.jaxws.support.JaxWsServerFactoryBean。这是 Apache CXF 特定的对象。如果您使用纯 Spring 方法来构建服务,则不会强制使用 Apache CXF 特定 API 与服务交互。

jaxws:server 元素的属性和子项指定实例化服务提供商所需的所有信息。属性指定实例化端点所需的信息。子项用于配置拦截器和其他高级功能。

识别要配置的端点

为了让运行时将配置应用到正确的服务提供商,它必须能够识别它。识别服务提供商的基本方法是指定实现端点的类。这使用 jaxws:server 元素的 serviceBean 属性完成。

对于不同端点共享一个共同实施的实例,可以为每个端点提供不同的配置。在配置中区分特定端点的方法有两种:

  • serviceName 属性和 endpointName 属性的组合

    serviceName 属性指定定义服务端点的 wsdl:service 元素。endpointName 属性指定定义服务端点的特定 wsdl:port 元素。这两个属性都使用格式 ns 指定为 QNames:名称ns 是元素的命名空间,name 是元素的 name 属性的值。

    注意

    如果 wsdl:service 元素只有一个 wsdl:port 元素,则可以省略 endpointName 属性。

  • name 属性

    name 属性指定定义服务端点的特定 wsdl:port 元素的 QName。QName 以 {ns}localPart格式提供nswsdl:port 元素的命名空间,localPartwsdl:port 元素的 name 属性的值。

属性

jaxws:server 元素的属性配置端点的基本属性。这些属性包括端点的地址、实施端点的类以及托管端点的 总线

表 17.2 “使用 jaxws:server 元素配置 JAX-WS 服务提供商的属性” 描述 jaxws:server 元素的属性。

表 17.2. 使用 jaxws:server 元素配置 JAX-WS 服务提供商的属性
属性描述

id

指定其他配置元素可用于引用端点的唯一标识符。

serviceBean

指定实施该服务的类。您可以使用类名称或对配置实施类的 Spring bean 的 ID 引用来指定实施类。此类必须位于 classpath 上。

serviceClass

指定实施该服务的类。当提供给 implementor 属性的值是使用 Spring AOP 打包的 bean 的引用时,此属性很有用。

address

指定 HTTP 端点的地址。这个值将覆盖服务合同中指定的值。

wsdlLocation

指定端点的 WSDL 合同的位置。WSDL 合同的位置相对于部署该服务的文件夹。

endpointName

指定服务的 wsdl:port 元素的 name 属性的值。它使用格式 ns:name 格式将其指定为 QName,其中 nswsdl:port 元素的命名空间。

serviceName

指定服务的 wsdl:service 元素的 name 属性的值。它使用格式 ns:name 格式将其指定为 QName,其中 nswsdl:service 元素的命名空间。

publish

指定是否应自动发布该服务。如果将其设置为 false,则开发人员必须明确发布 第 31 章 发布服务 中描述的端点。

bus

指定配置用于管理服务端点总线的 Spring bean 的 ID。这在将多个端点配置为使用一组常用功能时很有用。

bindingId

指定服务使用的消息绑定的 ID。第 23 章 Apache CXF 绑定 ID 中提供了有效绑定 ID 列表。

name

指定服务的 wsdl:port 元素的字符串指定的 QName。它使用 {ns}localPart 格式将其指定为 QName,其中 nswsdl:port 元素的命名空间,localPartwsdl:port 元素的 name 属性的值。

abstract

指定 bean 是否为抽象 Bean。抽象 Bean 充当 concrete bean 定义的父项,且不会实例化。默认值为 false。把它设置为 true 会指示 bean 工厂不会实例化 bean。

dependent-on

指定在实例化端点前,端点依赖实例化的 Bean 列表。

createdFromAPI

指定使用 Apache CXF API 创建的 bean 用户,如 Endpoint.publish ()Service.getPort ()

默认值为 false

把它设置为 true 执行以下操作:

  • 通过将 .jaxws-endpoint 附加到其 id 来更改 bean 的内部名称
  • 使 bean 抽象

除了 表 17.2 “使用 jaxws:server 元素配置 JAX-WS 服务提供商的属性” 中列出的属性外,您可能需要使用多个 xmlns:shortName 属性来声明 endpointNameserviceName 属性使用的命名空间。

示例

例 17.4 “简单的 JAX-WS 服务器配置” 显示 JAX-WS 端点的配置,用于指定发布端点的地址。

例 17.4. 简单的 JAX-WS 服务器配置

<beans ...
  xmlns:jaxws="http://cxf.apache.org/jaxws"
  ...
  schemaLocation="...
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
    ...">
  <jaxws:server id="exampleServer"
                  serviceBean="org.apache.cxf.example.DemoImpl"
                  address="http://localhost:8080/demo" />
</beans>

17.1.4. 在服务提供商中添加功能

概述

jaxws:endpointjaxws:server 元素提供了实例化服务提供商所需的基本配置信息。要在服务供应商或执行高级配置中添加功能,您必须将子元素添加到配置中。

子元素允许您执行以下操作:

元素

表 17.3 “用于配置 JAX-WS 服务供应商的元素” 描述 jaxws:endpoint 支持的子元素。

表 17.3. 用于配置 JAX-WS 服务供应商的元素
元素描述

jaxws:handlers

指定用于处理消息的 JAX-WS 处理程序列表。有关 JAX-WS 处理程序实现的详情,请参考 第 43 章 编写处理程序

jaxws:inInterceptors

指定处理入站请求的拦截器列表。如需更多信息,请参阅 第 VII 部分 “开发 Apache CXF Interceptors”

jaxws:inFaultInterceptors

指定处理入站故障消息的拦截器列表。如需更多信息,请参阅 第 VII 部分 “开发 Apache CXF Interceptors”

jaxws:outInterceptors

指定处理出站回复的拦截器列表。如需更多信息,请参阅 第 VII 部分 “开发 Apache CXF Interceptors”

jaxws:outFaultInterceptors

指定处理出站故障消息的拦截器列表。如需更多信息,请参阅 第 VII 部分 “开发 Apache CXF Interceptors”

jaxws:binding

指定 bean 配置端点使用的消息绑定。消息绑定使用 org.apache.cxf.binding.BindingFactory 接口的实现进行配置。[a]

jaxws:dataBinding [b]

指定实施端点使用的数据绑定的类。这使用嵌入式 bean 定义来指定。

jaxws:executor

指定用于该服务的 Java executor。这使用嵌入式 bean 定义来指定。

jaxws:features

指定配置 Apache CXF 高级功能的 Bean 列表。您可以提供 bean 引用列表或嵌入式 Bean 列表。

jaxws:invoker

指定服务使用的 org.apache.cxf.service.Invoker 接口的实现。 [c]

jaxws:properties

指定与端点一起传递的属性的 Spring 映射。这些属性可用于控制诸如启用 MTOM 支持等功能。

jaxws:serviceFactory

指定 bean 配置用于实例化该服务的 JaxWsServiceFactoryBean 对象。

[a] SOAP 绑定使用 soap:soapBinding bean 配置。
[b] jaxws:endpoint 元素不支持 jaxws:dataBinding 元素。
[c] Invoker 实现控制如何调用服务。例如,它控制每个请求是否由服务实施的新实例处理,还是在调用之间保留状态。

17.1.5. 在 JAX-WS 端点上启用架构验证

概述

您可以设置 schema-validation-enabled 属性,以便在 jaxws:endpoint 元素或 jaxws:server 元素上启用 schema 验证。启用 schema 验证后,在客户端和服务器间发送的消息会被检查是否符合 schema。默认情况下,架构验证会被关闭,因为它对性能有严重影响。

示例

要在 JAX-WS 端点上启用架构验证,请在 jaxws:properties 子元素或 jaxws:server 元素的 jaxws: properties 子元素中设置 schema-validation-enabled 属性。例如,要在 jaxws:endpoint 元素中启用模式验证:

<jaxws:endpoint name="{http://apache.org/hello_world_soap_http}SoapPort"
    wsdlLocation="wsdl/hello_world.wsdl"
    createdFromAPI="true">
    <jaxws:properties>
        <entry key="schema-validation-enabled" value="BOTH" />
    </jaxws:properties>
</jaxws:endpoint>

有关 schema-validation-enabled 属性的允许值列表,请参阅 第 24.3.4.7 节 “模式验证类型值”

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.