对于 JAX-WS 应用程序,您可以通过在代码中使用寻址注释,在服务应用程序的开发期间启用 WS-Addressing 支持。您还可以在使用插入的 Web Service 代理引用的客户机应用程序中使用此方法。
关于此任务
在您的服务代码中使用以下某个寻址注释:
- Addressing - 如果您要使用 2005/08 WS-Addressing 规范,请使用此注释。
- SubmissionAddressing - 如果您要使用 2004/08 WS-Addressing 规范,请使用此注释。
在客户机上,仅使用寻址注释;不支持 SubmissionAddressing 注释。必须指定寻址注释以及 WebServiceRef 注释。WebServiceRef 注释指定客户机容器插入的 Web Service 代理的引用。
注释设置将覆盖 WSDL 文档中的设置。如果手动创建 WSDL 文档,而不是根据代码生成该文档,那么注释设置可能与 WSDL 设置不同。
最多为每个注释可指定三个可选参数:
表 1. 寻址注释的参数. 该表列出了各个参数以及其可能的值和每个参数的描述。参数名称 |
可能的值 |
描述 |
已启用 |
true(缺省值)
false
|
是否启用 WS-Addressing 支持。 |
required |
true
false(缺省值)
|
是否需要 WS-Addressing 头。 |
responses |
Responses.All(缺省值)
Responses.ANONYMOUS
Responses.NON_ANONYMOUS
|
使用同步还是异步消息交换模式。指定 Responses.ANONYMOUS 以通过同步消息模式发送消息;使用 Responses.NON_ANONYMOUS 以通过异步消息交换模式发送消息。 注: 不支持对 SubmissionAddressing 注释使用此参数。
|
注: 只能将 Addressing 注释与 SOAP(1.1 或 1.2)over HTTP 绑定配合使用。如果将类与其他绑定(例如,XML over HTTP)一起使用,那么将在客户机上抛出异常,并且在服务器上,Web Service 将无法部署。
过程
- 要在服务应用程序中以编程方式修改 WS-Addressing 支持的行为,请在代码中使用以下寻址注释中的其中一个,并根据需要使用可选参数。 在以下示例中,使用 Addressing 注释时没有使用参数,所以适用缺省设置。
import javax.xml.ws.soap.Addressing;
@Addressing
@WebService(endpointInterface =
"org.apache.axis2.jaxws.calculator.Calculator",
serviceName = "CalculatorService",
portName = "CalculatorServicePort",
targetNamespace = "http://calculator.jaxws.axis2.apache.org")
在以下示例中,使用 SubmissionAddressing 注释时使用了指定启用且需要 WS-Addressing 的参数。不支持对此注释使用 responses 属性。import com.ibm.websphere.wsaddressing.jaxws21.SubmissionAddressing;
@SubmissionAddressing(enabled=true, required=true)
@WebService(endpointInterface =
"org.apache.axis2.jaxws.calculator.Calculator",
serviceName = "CalculatorService",
portName = "CalculatorServicePort",
targetNamespace = "http://calculator.jaxws.axis2.apache.org")
- 要在使用插入的 Web Service 代理引用的客户机上启用 WS-Addressing 支持,请将寻址注释和需要的可选参数以及 WebServiceRef 注释结合使用。此方法不支持 SubmissionAddressing 注释。
例如,以下代码片段指定启用 WS-Addressing,并使用同步消息交换模式:
public class MyClientApplication {
// Enable Addressing for a port-component-ref resource injection.
@Addressing(enabled=true, responses=Responses.ANONYMOUS)
@WebServiceRef(MyService.class)
private MyPortType myPort;
...
}
结果
如果在服务应用程序中使用寻址注释,那么服务器会处理符合入站 SOAP 消息的相关规范的任何 WS-Addressing 头。如果您指定需要 WS-Addressing,并且入站 SOAP 消息不包含任何 WS-Addressing 头或包含的 WS-Addressing 头不符合注释指示的规范,那么服务器将返回故障消息。例如,如果客户机发送包含 2004/08 WS-Addressing 头的消息并且服务器需要 2005/08 头,那么服务器将返回故障消息。
如果使用寻址注释并根据代码生成了 WSDL 文档,那么将在 WSDL 文档中创建 UsingAddressing 元素和 WS-Policy 断言。使用此 WSDL 文档的客户机将在其消息中包含 WS-Addressing 信息。当前 WSDL 生成工具不理解 SubmissionAddressing 注释。但是,WSDL 文档不区分 2005/08 规范和 2004/08 规范,所以如果您要从包含 SubmissionAddressing 注释的代码生成 WSDL 文档,请将 Addressing 和 SubmissionAddressing 注释一起使用。
如果您指定响应属性,将使用相应的消息交换模式。