第 17 章 配置 JAX-WS 端点

摘要

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

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

您必须使用配置元素激活一些高级功能,如 WS-RM。这可以通过为端点的配置元素提供子元素来实现。请注意,当处理使用 Java 优先方法开发的端点时,SEI 服务可能会因为端点的合同缺乏与要使用的绑定和传输有关的信息。

17.1. 配置服务供应商

17.1.1. 配置服务提供程序的元素

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

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

17.1.2. 使用 jaxws:endpoint Element

概述

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

识别正在配置的端点

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

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

  • serviceName 属性和 endpointName 属性的组合

    serviceName 属性指定定义该服务端点的 wsdl:service 元素。endpointName 属性指定定义服务端点的特定 wsdl:port 元素。这两个属性都使用 ns:name 的格式指定为 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

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

implementor

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

implementorClass

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

address

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

wsdlLocation

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

endpointName

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

serviceName

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

publish

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

总线

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

bindingUri

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

name

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

abstract

指定 bean 是否为抽象 bean。abstract Bean 充当拥塞 Bean 定义且没有实例化的父项。默认值为 false。将其设置为 true 指示 bean 工厂不会实例化 bean。

dependent-on

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

createdFromAPI

指定使用 Apache CXF API 创建的用户,如 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 服务提供商的属性” 中列出的属性,您可能需要使用多个 ns: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 上使用 servlet 传输(pax-web-undertow),这样可启用对 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:name 的格式指定为 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 Element 配置 JAX-WS 服务提供商的属性” 描述 jaxws:server 元素的属性。

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

属性描述

id

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

serviceBean

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

serviceClass

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

address

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

wsdlLocation

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

endpointName

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

serviceName

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

publish

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

总线

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

bindingId

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

name

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

abstract

指定 bean 是否为抽象 bean。abstract Bean 充当拥塞 Bean 定义且没有实例化的父项。默认值为 false。将其设置为 true 指示 bean 工厂不会实例化 bean。

dependent-on

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

createdFromAPI

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

默认值为 false

将其设置为 true 执行以下操作:

  • 通过将 .jaxws-endpoint 附加到其 id 来修改 bean 的内部名称
  • 使 bean 摘要

除了 表 17.2 “使用 jaxws:server Element 配置 JAX-WS 服务提供商的属性” 中列出的属性,您可能需要使用多个 ns: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 Handler 实施列表。有关 JAX-WS Handler 实施的更多信息,请参阅 第 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.Binding factory 接口的实现来配置消息绑定。[a]

jaxws:dataBinding [b]

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

jaxws:executor

指定用于该服务的 Java 执行程序。这使用嵌入式 bean 定义进行指定。

jaxws:features

指定 Beans 列表,用于配置 Apache CXF 的高级功能。您可以提供 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 验证

概述

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

示例

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

<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 节 “架构验证类型值”