| 这些天一直在关注WebService,SOA的核心理念是“S”,即服务。当我们的构件完成之后,究竟如何发布为何种服务,这就设计到了SCA绑定的问题。我这里研究了一下Cxf框架,与大家一同分享,如理解有偏差,请大家指出,谢谢。 SCA绑定用于包含在SCA域里的引用和服务之间的服务交互。绑定类型以哪种方式被实现没有在SCA规范中定义,它可以被不同的SCA运行时(runtimes)通过不用的方式实现。唯一的要求是:SCA绑定类型中必需的服务必须被实现。
Web Service绑定的Schema如下:
<binding.ws wsdlElement="xs:anyURI"?
wsdli:wsdlLocation="list of xs:anyURI"?
...>
<wsa:EndpointReference>...</wsa:EndpointReference>*
...
</binding.ws>
1. Endpoint URI 解析
解析SCA服务中的URI的规则已经制定好了,URI是如下形式:
1). endpoint里的URIs或由wsa:EndpointReference的wsa:Address元素指定的URI
2). 在binding.ws元素中使用“uri”属性显示指定
3). 由组装规范(Assembly specification)定义的隐式URI。
2. SCA服务的WSDL描述
任何一个拥有1个或多个使用HTTP的web 服务绑定的服务必须返回一个WSDL描述,通过在HTTP endpoint后加上一个“?wsdl”的一个http get请求后缀就可以得到。
下面是一个使用CXF框架生成WSDL描述的的helloworld例子:
1.定义接口
@WebService
public interface HelloWorld {
String sayHi(@WebParam(name="text") String text);
}
2.实现接口
@WebService(endpointInterface = "com.zx.cxf.service.HelloWorld", serviceName = "HelloWorld")
public class HelloWorldImpl implements HelloWorld {
public String sayHi(String text) {
return "Hello " + text;
}
}
3.配置并发布服务
<jaxws:endpoint id="helloWorld"
implementor="com.zx.cxf.service.HelloWorldImpl"
address="/HelloWorld">
</jaxws:endpoint>
4.查看WSDL描述
<?xml version="1.0" encoding="UTF-8" ?>
- <wsdl:definitions name="HelloWorld" targetNamespace="http://service.cxf.zx.com/" xmlns:ns1="http://cxf.apache.org/bindings/xformat" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.cxf.zx.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://service.cxf.zx.com/" xmlns:tns="http://service.cxf.zx.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="sayHi" type="tns:sayHi" />
<xs:element name="sayHiResponse" type="tns:sayHiResponse" />
- <xs:complexType name="sayHi">
<xs:element minOccurs="0" name="text" type="xs:string" />
</xs:sequence>
</xs:complexType>
- <xs:complexType name="sayHiResponse">
<xs:element minOccurs="0" name="return" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
- <wsdl:message name="sayHiResponse">
<wsdl:part element="tns:sayHiResponse" name="parameters" />
</wsdl:message>
- <wsdl:message name="sayHi">
<wsdl:part element="tns:sayHi" name="parameters" />
</wsdl:message>
- <wsdl:portType name="HelloWorld">
- <wsdl:operation name="sayHi">
<wsdl:input message="tns:sayHi" name="sayHi" />
<wsdl:output message="tns:sayHiResponse" name="sayHiResponse" />
</wsdl:operation>
</wsdl:portType>
- <wsdl:binding name="HelloWorldSoapBinding" type="tns:HelloWorld">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
- <wsdl:operation name="sayHi">
<soap:operation soapAction="" style="document" />
- <wsdl:input name="sayHi">
<soap:body use="literal" />
</wsdl:input>
- <wsdl:output name="sayHiResponse">
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
- <wsdl:service name="HelloWorld">
- <wsdl:port binding="tns:HelloWorldSoapBinding" name="HelloWorldImplPort">
<soap:address location="http://localhost:8081/CxfServiceTest/HelloWorld" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
5. 客户端访问
public static void main(String args[]) throws Exception {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
factory.setServiceClass(HelloWorld.class);
factory
.setAddress("http://localhost:8080/CxfService/HelloWorld");
HelloWorld client = (HelloWorld) factory.create();
String reply = client.sayHi("HI");
System.out.println("Server said: " + reply);
}
|