版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/cblstc/article/details/82630070
1. 基本环境
tomcat6、spring、jdk1.7
2. 引入cxf的jar包
Spring框架整合webservice需要用到cxf框架,需要在pom.xml里引入以下jar包
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>2.2.3</version>
</dependency>
3. 在web.xml中配置CXFServlet
这里的/services/*对应的路径就是:http://localhost:8080/项目名/services
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
4. 在applicationContext.xml中配置endpoint
注意需要引入以下命名空间,否则jaxws:endpoint无法识别
我们的最终访问路径是:http://localhost:8080/项目名/services/XXXService?wsdl
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
这里的cxf*.xml文件会自动引入,只要你jar包没问题。
<import resource="classpath*:META-INF/cxf/cxf.xml" />
<import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="pendServiceEndPoint" implementor="com.xxx.service.impl.XXXServiceImpl" address="/XXXService"></jaxws:endpoint>
5. 编写IXXXService接口
接口类需要写@WebService
@WebParam表示在xml中显示的名称
@WebService
public interface IXXXService {
@WebMethod
public String getXXX(
@WebParam(name="XXX1") String xxx1,
@WebParam(name="XXX2") String xxx2);
6. 编写XXXServiceImpl
@webservice加不加没有问题
由于返回的是xml字符串,所以使用了dom4j解析。
当然,你也可以返回一个对象。
@WebService
public class XXXServiceImpl implements IXXXService {
@WebMethod
@Override
public String getXXX(
@WebParam(name="XXX1") String xxx1,
@WebParam(name="XXX2") String xxx2) {
String result = null;
// dom4j 拼接xml
Document document = DocumentHelper.createDocument();
Element rootElement = document.addElement("root");
Element resultElement = rootElement.addElement("Result");
resultElement.addCDATA("1");
Element errorElement = rootElement.addElement("ErrorDescription");
errorElement.addCDATA("发生了错误!");
return formatXML(document);
}
/**
* 格式化xml字符串
* @param document
* @return
*/
public String formatXML(Document document) {
String result = null;
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
StringWriter writer = null;
try {
writer = new StringWriter();
XMLWriter xmlWriter = new XMLWriter(writer, format);
xmlWriter.write(document);
xmlWriter.close();
result = writer.toString();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
7. 调试
我使用两种方式:1. SoapUI软件调试;2. Eclipse自动生成代码
7.1 SoapUI调试(推荐)
首先官网下载SoapUI,安装
新建一个SOAP,然后输入访问的地址
然后看到左边栏出现接口的方法,展开方法,双击请求,可以看到请求和响应的界面,改变输入参数的值,点击执行,即可得到返回结果
- 请求里面的代码
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:util="http://utils.cbl/">
<soapenv:Header/>
<soapenv:Body>
<util:getXXX>
<!--Optional:-->
<XXX1>?</XXX1>
<!--Optional:-->
<XXX2>?</XXX2>
</util:getXXX>
</soapenv:Body>
</soapenv:Envelope>
- 响应里面的代码
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getXXXResponse xmlns:ns2="http://service.pendingservice.gdcn.com/">
<return>
<!-- 里面的内容是返回的xml -->
</return>
</ns2:getXXXResponse>
</soap:Body>
</soap:Envelope>
7.2 Eclipse自动生成代码
eclipse新建一个java项目
右键 -> 新建 -> other -> web service client -> 输入访问地址
eclipse会自动帮我们生成一些代码
然后写一个测试类
String endPoint = "http://localhost:8080/项目名/services/XXXService?wsdl";
URL endPointUrl = new URL(endPoint);
XXXServiceImplServiceLocator service = new XXXServiceImplServiceLocator();
XXXServiceImplServiceSoapBindingStub xxx = new XXXServiceImplServiceSoapBindingStub(endPointUrl, service);
String result = xxx.getXXX("123","123");
System.out.println(result);