第 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格式提供
。ns 是wsdl:port
元素的命名空间,localPart 是wsdl:port
元素的name
属性的值。
属性
jaxws:endpoint
元素的属性配置端点的基本属性。这些属性包括端点的地址、实施端点的类以及托管端点的 总线
。
表 17.1 “使用 jaxws:endpoint Element 配置 JAX-WS 服务提供商的属性” 描述 jaxws:endpoint
元素的属性。
属性 | 描述 |
---|---|
指定其他配置元素可用于引用端点的唯一标识符。 | |
指定实施该服务的类。您可以使用类名称或 Spring bean 配置实施类类来指定实施类。此类必须在 classpath 上。 | |
指定实施该服务的类。当提供给 | |
指定 HTTP 端点的地址。这个值会覆盖服务合同中指定的值。 | |
指定端点的 WSDL 合同的位置。WSDL 合同的位置相对于部署服务的文件夹。 | |
指定服务 | |
指定服务 | |
指定是否应该自动发布该服务。如果此项设为 | |
指定 Spring Bean 的 ID,配置用于管理服务端点的总线。这在将多个端点配置为使用一组通用的功能时,这很有用。 | |
指定服务使用的消息绑定 ID。第 23 章 Apache CXF Binding ID 中提供了有效绑定 ID 列表。 | |
指定服务 | |
指定 bean 是否为抽象 bean。abstract Bean 充当拥塞 Bean 定义且没有实例化的父项。默认值为 | |
指定在端点实例化前端点要实例化的 Bean 列表。 | |
指定使用 Apache CXF API 创建的用户,如
默认值为
将其设置为
| |
放置在生成的 WSDL 的 |
除了 表 17.1 “使用 jaxws:endpoint Element 配置 JAX-WS 服务提供商的属性” 中列出的属性,您可能需要使用多个 ns:shortName属性来
声明 endpointName
和 serviceName
属性使用的命名空间。
示例
例 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格式提供
。ns 是wsdl:port
元素的命名空间,localPart 是wsdl:port
元素的name
属性的值。
属性
jaxws:server
元素的属性配置端点的基本属性。这些属性包括端点的地址、实施端点的类以及托管端点的 总线
。
表 17.2 “使用 jaxws:server Element 配置 JAX-WS 服务提供商的属性” 描述 jaxws:server
元素的属性。
属性 | 描述 |
---|---|
指定其他配置元素可用于引用端点的唯一标识符。 | |
指定实施该服务的类。您可以使用类名称或 Spring bean 配置实施类类来指定实施类。此类必须在 classpath 上。 | |
指定实施该服务的类。当提供给 | |
指定 HTTP 端点的地址。这个值将覆盖服务合同中指定的值。 | |
指定端点的 WSDL 合同的位置。WSDL 合同的位置相对于部署服务的文件夹。 | |
指定服务 | |
指定服务 | |
指定是否应该自动发布该服务。如果此项设为 | |
指定 Spring Bean 的 ID,配置用于管理服务端点的总线。这在将多个端点配置为使用一组通用的功能时,这很有用。 | |
指定服务使用的消息绑定 ID。第 23 章 Apache CXF Binding ID 中提供了有效绑定 ID 列表。 | |
指定服务 | |
指定 bean 是否为抽象 bean。abstract Bean 充当拥塞 Bean 定义且没有实例化的父项。默认值为 | |
指定在端点实例化前端点要实例化的 Bean 列表。 | |
指定使用 Apache CXF API 创建的用户,如
默认值为
将其设置为
|
除了 表 17.2 “使用 jaxws:server Element 配置 JAX-WS 服务提供商的属性” 中列出的属性,您可能需要使用多个 ns:shortName属性来
声明 endpointName
和 serviceName
属性使用的命名空间。
示例
例 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:endpoint
和 jaxws:server
元素提供实例化服务提供商所需的基本配置信息。要向服务提供商添加功能或执行高级配置,您必须将子元素添加到配置中。
子元素允许您进行以下操作:
元素
表 17.3 “用于配置 JAX-WS 服务提供程序的元素” 描述 jaxws:endpoint
支持的子元素。
元素 | 描述 |
---|---|
指定用于处理消息的 JAX-WS Handler 实施列表。有关 JAX-WS Handler 实施的更多信息,请参阅 第 43 章 编写处理程序。 | |
指定处理入站请求的拦截器列表。更多信息请参阅 第 VII 部分 “开发 Apache CXF Interceptors”。 | |
指定处理入站错误信息的拦截器列表。更多信息请参阅 第 VII 部分 “开发 Apache CXF Interceptors”。 | |
指定处理出站回复的拦截器列表。更多信息请参阅 第 VII 部分 “开发 Apache CXF Interceptors”。 | |
指定处理出站错误信息的拦截器列表。更多信息请参阅 第 VII 部分 “开发 Apache CXF Interceptors”。 | |
指定 bean 配置端点使用的消息绑定。使用 | |
| 指定实施端点使用的数据绑定的类。这使用嵌入式 bean 定义进行指定。 |
指定用于该服务的 Java 执行程序。这使用嵌入式 bean 定义进行指定。 | |
指定 Beans 列表,用于配置 Apache CXF 的高级功能。您可以提供 bean 引用列表或嵌入式 Bean 列表。 | |
指定服务使用的 org.apache.cxf.service.Invoker 接口的实施。[c] | |
指定传递给端点的属性的 Spring 映射。这些属性可用于控制启用 MTOM 支持等功能。 | |
指定 Bean 配置用于实例化该服务的 | |
[a]
SOAP 绑定使用 soap: SOApBinding bean 进行配置。
[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 节 “架构验证类型值”。