springmvc+webservice+axis实例

最近正好做到这样的一个需求,写一个对接其它系统的接口,采用webservice(soap)的方式调用。之前我仅是了解一点webservice,所以边学习边实践,这个需求花了我五天时间。废话少说,开始撸代码!

  1. 相关jar包
    jar包我就没有整理了,一会贴上代码,需要的可以自行百度哦。

  2. 代码实现
    接口:

public interface MmcWebService {

    String A(Integer IDType,String ID,String TimeStamp);

    String B(Integer IDType,String ID,String TimeStamp);
}

实现类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

@Service("WebService")
public class MmcWebServiceImpl implements MmcWebService {
    @Autowired
    private Handler handler;

    /** 对象转xml
     * @param cls
     * @param obj
     * @return
     * @throws Exception
     */
    private String beanToXMLString(Class cls, Object obj) throws Exception {
        JAXBContext jaxbContext = JAXBContext.newInstance(cls);
        Marshaller marshaller = jaxbContext.createMarshaller();
        // 编码格式
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        // 是否格式化生成的xml的样式
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        // 是否省略xml头部声明信息
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

        StringWriter writer = new StringWriter();
        marshaller.marshal(obj, writer);
        writer.close();
        return writer.toString();
    }

    @Override
    public String A(Integer IDType,String ID,String TimeStamp) {
        try {
            //业务代码位置
            return beanToXMLString(实体类.class,字符串数据);
            }
        }
        catch (Exception e){
            return e.getMessage();
        }
        return null;
    }

    @Override
    public String B(Integer IDType,String ID,String TimeStamp) {
        try {
            //业务代码位置
            return beanToXMLString(实体类.class,字符串数据);
            }
        }
        catch (Exception e){
            return e.getMessage();
        }
        return null;
    }
}

配置:图示位置深颜色是需要添加的文件,如果有多个不同的webservices服务,则在WEB-INF/services中添加对应的文件夹。

1.services.xml

<?xml version="1.0" encoding="UTF-8"?>
<service name="自定义名称" targetNamespace="命名空间">
    <parameter name="ServiceObjectSupplier" locked="false">
        org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier
    </parameter>
    <parameter name="load-on-startup">true</parameter>
    <parameter name="ServiceClass" locked="false">service的路径</parameter>
    <parameter name="SpringBeanName">service名称</parameter>
     <schema schemaNamespace="命名空间"/>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
                         class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                         class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
</service>

2.web.xml

<servlet>
        <servlet-name>自定义名称</servlet-name>
        <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>自定义名称</servlet-name>
        <url-pattern>service路径</url-pattern>
    </servlet-mapping>

到这里就配置好了webservice服务,项目启动后,查看发布地址。
http://ip:端口/项目名称/services/服务名称?wsdl

  1. soap请求服务
String url = "http://ip:端口/项目名称/services/服务名称/方法";
        String soap = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org/\">\n" +
                "   <soapenv:Header/>\n" +
                "   <soapenv:Body>\n" +
                "      <tem:GetLisReport>\n" +
                "         <tem:IDType>" + 数据 + "</tem:IDType>\n" +
                "         <tem:ID>" + 数据 + "</tem:ID>\n" +
                "         <tem:Timestamp>" + 数据 + "</tem:Timestamp>\n" +
                "      </tem:GetLisReport>\n" +
                "   </soapenv:Body>\n" +
                "</soapenv:Envelope>";
        String soapAction = "http://tempuri.org/服务名称/方法";
        String contentType = "text/xml;charset=UTF-8";
        HttpHeaders headers = new HttpHeaders();
        headers.set("Content-Type", contentType);
        headers.add("SOAPAction", soapAction);
        HttpEntity<String> request = new HttpEntity<>(soap, headers);
        String resp = new RestTemplate().postForObject(url, request, String.class);
        resp = StringEscapeUtils.unescapeXml(resp);
        System.out.println(resp);

**注意:**soapAction 的前缀网址其实是命名空间的地址;
StringEscapeUtils.unescapeXml()方法是反转义字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值