1、服务端发布webservice:
@WebService(targetNamespace = "http://tempuri.org/ns.xsd") @BindingType(value = SOAPBinding.SOAP12HTTP_BINDING) public class WSServices { //ws服务端提供的方法 public String initSystem(@WebParam(name = "xml",targetNamespace = "http://tempuri.org/ns.xsd") String xml){ //。。。 return sss; } }
2、客户端调用:
一、采用wsdl自动生成客户端调用
二、采用CXF调用WebService:
添加依赖包
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.1.16</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>3.1.16</version> </dependency>
调用
import com.alibaba.fastjson.JSONObject; import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; import org.apache.log4j.Logger; import org.json.XML; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.xml.namespace.QName; import java.util.ResourceBundle; @Component public class Async2tda { private static final Logger logger = Logger.getLogger(Async2tda.class); private static ResourceBundle resource = ResourceBundle.getBundle("application"); private static Client client; private static QName qName; //多次调用wsClient,Client和QName初始化一次 public void sendTdaXML(String xml){ try { if (!StringUtils.isEmpty(xml)) { //。。。 if (client == null || qName == null){ client = getClient(); qName = getQName(); } if (client != null && qName != null){ Object[] o = client.invoke(qName,xmlStr); } } } catch (Exception e) { } } public static Client getClient (){ String newUrl = null; JaxWsDynamicClientFactory dcf = null; try { String ip = resource.getString("82ws.ip"); String port = resource.getString("82ws.port"); newUrl = "http://"+ip+":"+port+"/services/ThirdBayonetService?wsdl"; dcf = JaxWsDynamicClientFactory.newInstance(); return dcf.createClient(newUrl); } catch (Exception e) { return null; } } public static QName getQName(){ return new QName("http://.....com", "insertInfo"); } }
3、常见问题:
1、A SOAP 1.2 message is not valid when sent to a SOAP 1.1 only endpoint.
原因:soap协议不匹配,Server端用的是SOAP1.1,Client端用的是SOAP1.2
解决方法:在接口或类实现上添加@BindingType
2、javax.xml.bind.UnmarshalException: 意外的元素 (uri:"xxx", local:"xml")。所需元素为<{}arg0>
解决方法:接口暴露出来的方法需要加上@WebParam注解@WebParam(name = "xml",targetNamespace = "http://...")