1、先把webservice服務端寫入項目(基於spring)java
一、在pom.xml中引入WebService相關的jar依賴web
1 <!--webservice開始 --> 2 <!--https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws --> 3 <dependency> 4 <groupId>org.apache.cxf</groupId> 5 <artifactId>cxf-rt-frontend-jaxws</artifactId> 6 <version>3.1.16</version> 7 </dependency> 8 <!--https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-transports-http --> 9 <dependency> 10 <groupId>org.apache.cxf</groupId> 11 <artifactId>cxf-rt-transports-http</artifactId> 12 <version>3.1.6</version> 13 </dependency> 14 <!--webservice結束 -->
二、在web.xml加載啓動Webservicespring
1 <!--webservice --> 2 3 <servlet> 4 5 <servlet-name>cxf</servlet-name> 6 7 <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> 8 9 <load-on-startup>1</load-on-startup> 10 11 </servlet> 12 13 <servlet-mapping> 14 15 <servlet-name>cxf</servlet-name> 16 17 <url-pattern>/GetKPIValue/*</url-pattern> 18 19 </servlet-mapping>
三、建立WebService相關的Spring配置文件:applicationContext-webService.xml,內容以下:apache
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" 6 7 xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd 8 9 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> 10 11 <bean id="userServiceImpls" class="com.unis.webService.UserServiceImpls" /> 12 13 <jaxws:endpoint id="userServiceImplServices" address="/" implementor="#userServiceImpls"> 14 15 </jaxws:endpoint> 16 17 </beans>
四、把服務端代碼遷移到項目的src/main/java/com.webService,以下圖:數組
![]() |
五、啓動項目,並在瀏覽器中訪問地址:http://localhost:8091/GetKPIValue?wsdl,以下圖:瀏覽器
|
出現以上狀況說明webservice服務端成功啓動!app
代碼可參考 https://blog.csdn.net/c99463904/article/details/76018436frontend
備註:使用註解修改WSDL內容ide
WebService的註解都位於javax.jws包下: 工具 @WebService-定義服務,在類上邊 targetNamespace:指定命名空間 name:portType的名稱 portName:port的名稱 serviceName:服務名稱 endpointInterface:SEI接口地址,若是一個服務類實現了多個接口,只須要發佈一個接口的方法,可經過此註解指定要發佈服務的接口。 @WebMethod-定義方法,在公開方法上邊 operationName:方法名 exclude:設置爲true表示此方法不是webservice方法,反之則表示webservice方法,默認是false @WebResult-定義返回值,在方法返回值前邊 name:返回結果值的名稱 @WebParam-定義參數,在方法參數前邊 name:指定參數的名稱 |
2、使用xml在webservice的客戶端與服務端進行傳遞
1.Xml與java對象互轉的工具類
1 package com.unis.webService.util; 2 import java.io.FileNotFoundException; 3 import java.io.FileReader; 4 import java.io.FileWriter; 5 import java.io.IOException; 6 import java.io.StringReader; 7 import java.io.StringWriter; 8 9 import javax.xml.bind.JAXBContext; 10 import javax.xml.bind.JAXBException; 11 import javax.xml.bind.Marshaller; 12 import javax.xml.bind.Unmarshaller; 13 14 /** 15 * xml與java對象互轉 16 * Name: 17 * Title:XmlHelper 18 * @author LSK 19 * @date 2019年1月5日 20 */ 21 public class XmlHelper 22 { 23 //有兩種狀況,一種是xml字符串,一種是xml文件路徑 24 25 /** 26 * 將對象直接轉換成String類型的 XML輸出 27 * 28 * @param obj 29 * @return 30 */ 31 @SuppressWarnings("rawtypes") 32 public static String objectToXML(Class clazz,Object obj) { 33 // 建立輸出流 34 StringWriter sw = new StringWriter(); 35 try { 36 // 利用jdk中自帶的轉換類實現 37 JAXBContext context = JAXBContext.newInstance(clazz); 38 39 Marshaller marshaller = context.createMarshaller(); 40 // 格式化xml輸出的格式 41 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, 42 Boolean.TRUE); 43 marshaller.setProperty("jaxb.encoding", "gb2312"); 44 45 // 將對象轉換成輸出流形式的xml 46 marshaller.marshal(obj, sw); 47 } catch (Exception e) { 48 e.printStackTrace(); 49 } 50 51 //去除xml聲明中的standalone 52 return sw.toString().replace("standalone=\"yes\"", ""); 53 54 } 55 56 /** 57 * 將String類型的xml轉換成對象 58 */ 59 @SuppressWarnings("rawtypes") 60 public static Object xmlToObject(Class clazz, String xml) { 61 Object xmlObject = null; 62 try { 63 JAXBContext context = JAXBContext.newInstance(clazz); 64 // 進行將Xml轉成對象的核心接口 65 Unmarshaller unmarshaller = context.createUnmarshaller(); 66 xmlObject = unmarshaller.unmarshal(new StringReader(xml)); 67 } catch (JAXBException e) { 68 e.printStackTrace(); 69 } 70 return xmlObject; 71 } 72 73 74 /** 75 * 將對象根據路徑轉換成xml文件 76 * 77 * @param obj 78 * @param path 79 * @return 80 */ 81 public static void convertToXml(Object obj, String path) { 82 try { 83 // 利用jdk中自帶的轉換類實現 84 JAXBContext context = JAXBContext.newInstance(obj.getClass()); 85 86 Marshaller marshaller = context.createMarshaller(); 87 // 格式化xml輸出的格式 88 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, 89 Boolean.TRUE); 90 // 將對象轉換成輸出流形式的xml 91 // 建立輸出流 92 FileWriter fw = null; 93 try { 94 fw = new FileWriter(path); 95 } catch (IOException e) { 96 e.printStackTrace(); 97 } 98 marshaller.marshal(obj, fw); 99 } catch (JAXBException e) { 100 e.printStackTrace(); 101 } 102 } 103 104 /** 105 * 將xml的文件路徑轉換成對象 106 */ 107 @SuppressWarnings("rawtypes") 108 public static Object convertXmlFileToObject(Class clazz, String xmlPath) { 109 Object xmlObject = null; 110 try { 111 JAXBContext context = JAXBContext.newInstance(clazz); 112 Unmarshaller unmarshaller = context.createUnmarshaller(); 113 FileReader fr = null; 114 try { 115 fr = new FileReader(xmlPath); 116 } catch (FileNotFoundException e) { 117 e.printStackTrace(); 118 } 119 xmlObject = unmarshaller.unmarshal(fr); 120 } catch (JAXBException e) { 121 e.printStackTrace(); 122 } 123 return xmlObject; 124 } 125 }
2.JAXB的簡介與經常使用註解詳解
JAXB(Java Architecture for XML Binding)是一項能夠根據XML Schema產生Java類的技術
JAXBContext類,是應用的入口,用於管理XML/Java綁定信息。
Marshaller接口,將Java對象序列化爲XML數據。
Unmarshaller接口,將XML數據反序列化爲Java對象。
以上這幾個是JDK中JAXB相關重要的Class和Interface
JDK中JAXB相關的重要Annotation(註釋):
@XmlType,將Java類或枚舉類型映射到XML模式類型
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或屬性是否被默認序列化。FIELD表示JAXB將自動綁定Java類中的每一個非靜態的(static)、非瞬態的(由@XmlTransient標註)字段到XML。其餘值有 XmlAccessType.PROPERTY和XmlAccessType.NONE。
@XmlAccessorOrder,控制JAXB綁定類中屬性和字段的排序。
@XmlJavaTypeAdapter,包、類、字段,方法、參數級別的註解。解決java日期(Date),數字(Number)格式化問題。
![]()
|
自定義的DateAdapter:
1 public class DateAdapter extends XmlAdapter<String, Date> { 2 private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd"); 3 @Override 4 public Date unmarshal(String date) throws Exception{ 5 return SDF.parse(date); 6 } 7 @Override 8 public String marshal(Date date) throws Exception { 9 return SDF.format(date); 10 } 11 }
![]()
|
@XmlElementWrapper ,對於數組或集合(即包含多個元素的成員變量),生成一個包裝該數組或集合的XML元素(稱爲包裝器)。
|
@XmlRootElement,類級別的註解,將類映射爲xml全局元素,也就是根元素。
@XmlElement,字段,方法,參數級別的註解。將Java類的一個屬性映射到與屬性同名的一個XML元素。
屬性:
nillable屬性能夠指定元素的文本值是否能夠爲空,默認爲false
required屬性能夠指定該元素是否必須出現,默認爲false
namespace屬性能夠指定該元素所屬的命名空間
defaultValue屬性能夠指定該元素默認的文本值
@XmlAttribute,字段和方法級別的註解。將Java類的一個屬性映射到與屬性同名的一個XML屬性。
|
只用到以上註解,想了解其餘詳細的可看: https://blog.csdn.net/lhzjj/article/details/11796713