第 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格式提供
。ns 是wsdl:port
元素的命名空间,localPart 是wsdl:port
元素的name
属性的值。
属性
jaxws:endpoint
元素的属性配置端点的基本属性。这些属性包括端点的地址、实施端点的类以及托管端点的 总线
。
表 17.1 “使用 jaxws:endpoint Element 配置 JAX-WS 服务提供商的属性” 描述 jaxws:endpoint
元素的属性。
属性 | 描述 |
---|---|
指定其他配置元素可用于引用端点的唯一标识符。 | |
指定实施该服务的类。您可以使用类名称或对配置实施类的 Spring bean 的 ID 引用来指定实施类。此类必须位于 classpath 上。 | |
指定实施该服务的类。当提供给 | |
指定 HTTP 端点的地址。这个值会覆盖服务合同中指定的值。 | |
指定端点的 WSDL 合同的位置。WSDL 合同的位置相对于部署该服务的文件夹。 | |
指定服务的 | |
指定服务的 | |
指定是否应自动发布该服务。如果将其设置为 | |
指定配置用于管理服务端点总线的 Spring bean 的 ID。这在将多个端点配置为使用一组常用功能时很有用。 | |
指定服务使用的消息绑定的 ID。第 23 章 Apache CXF 绑定 ID 中提供了有效绑定 ID 列表。 | |
指定服务的 | |
指定 bean 是否为抽象 Bean。抽象 Bean 充当 concrete bean 定义的父项,且不会实例化。默认值为 | |
指定在可以实例化前端点要实例化的 Bean 列表。 | |
指定使用 Apache CXF API 创建的 bean 用户,如
默认值为
把它设置为
| |
放置在生成的 WSDL 的 |
除了 表 17.1 “使用 jaxws:endpoint Element 配置 JAX-WS 服务提供商的属性” 中列出的属性外,您可能需要使用多个 xmlns: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 (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格式提供
。ns 是wsdl:port
元素的命名空间,localPart 是wsdl:port
元素的name
属性的值。
属性
jaxws:server
元素的属性配置端点的基本属性。这些属性包括端点的地址、实施端点的类以及托管端点的 总线
。
表 17.2 “使用 jaxws:server 元素配置 JAX-WS 服务提供商的属性” 描述 jaxws:server
元素的属性。
属性 | 描述 |
---|---|
指定其他配置元素可用于引用端点的唯一标识符。 | |
指定实施该服务的类。您可以使用类名称或对配置实施类的 Spring bean 的 ID 引用来指定实施类。此类必须位于 classpath 上。 | |
指定实施该服务的类。当提供给 | |
指定 HTTP 端点的地址。这个值将覆盖服务合同中指定的值。 | |
指定端点的 WSDL 合同的位置。WSDL 合同的位置相对于部署该服务的文件夹。 | |
指定服务的 | |
指定服务的 | |
指定是否应自动发布该服务。如果将其设置为 | |
指定配置用于管理服务端点总线的 Spring bean 的 ID。这在将多个端点配置为使用一组常用功能时很有用。 | |
指定服务使用的消息绑定的 ID。第 23 章 Apache CXF 绑定 ID 中提供了有效绑定 ID 列表。 | |
指定服务的 | |
指定 bean 是否为抽象 Bean。抽象 Bean 充当 concrete bean 定义的父项,且不会实例化。默认值为 | |
指定在实例化端点前,端点依赖实例化的 Bean 列表。 | |
指定使用 Apache CXF API 创建的 bean 用户,如
默认值为
把它设置为
|
除了 表 17.2 “使用 jaxws:server 元素配置 JAX-WS 服务提供商的属性” 中列出的属性外,您可能需要使用多个 xmlns: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 处理程序列表。有关 JAX-WS 处理程序实现的详情,请参考 第 43 章 编写处理程序。 | |
指定处理入站请求的拦截器列表。如需更多信息,请参阅 第 VII 部分 “开发 Apache CXF Interceptors”。 | |
指定处理入站故障消息的拦截器列表。如需更多信息,请参阅 第 VII 部分 “开发 Apache CXF Interceptors”。 | |
指定处理出站回复的拦截器列表。如需更多信息,请参阅 第 VII 部分 “开发 Apache CXF Interceptors”。 | |
指定处理出站故障消息的拦截器列表。如需更多信息,请参阅 第 VII 部分 “开发 Apache CXF Interceptors”。 | |
指定 bean 配置端点使用的消息绑定。消息绑定使用 | |
| 指定实施端点使用的数据绑定的类。这使用嵌入式 bean 定义来指定。 |
指定用于该服务的 Java executor。这使用嵌入式 bean 定义来指定。 | |
指定配置 Apache CXF 高级功能的 Bean 列表。您可以提供 bean 引用列表或嵌入式 Bean 列表。 | |
指定服务使用的 org.apache.cxf.service.Invoker 接口的实现。 [c] | |
指定与端点一起传递的属性的 Spring 映射。这些属性可用于控制诸如启用 MTOM 支持等功能。 | |
指定 bean 配置用于实例化该服务的 | |
[a]
SOAP 绑定使用 soap:soapBinding bean 配置。
[c]
Invoker 实现控制如何调用服务。例如,它控制每个请求是否由服务实施的新实例处理,还是在调用之间保留状态。
|
17.1.5. 在 JAX-WS 端点上启用架构验证
概述
您可以设置 schema-validation-enabled
属性,以便在 jaxws:endpoint
元素或 jaxws:server
元素上启用 schema 验证。启用 schema 验证后,在客户端和服务器间发送的消息会被检查是否符合 schema。默认情况下,架构验证会被关闭,因为它对性能有严重影响。
示例
要在 JAX-WS 端点上启用架构验证,请在 jaxws:properties 子元素或 jaxws:server
元素的
子元素中设置 jaxws:
propertiesschema-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 节 “模式验证类型值”。