最近正好做到这样的一个需求,写一个对接其它系统的接口,采用webservice(soap)的方式调用。之前我仅是了解一点webservice,所以边学习边实践,这个需求花了我五天时间。废话少说,开始撸代码!
-
相关jar包
jar包我就没有整理了,一会贴上代码,需要的可以自行百度哦。 -
代码实现
接口:
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
- 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()方法是反转义字符串。