基于spring框架的webservice接口的开发和调试

版权声明:本文为博主原创文章,转载请注明出处。 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);

猜你喜欢

转载自blog.csdn.net/cblstc/article/details/82630070