首先上项目的pom.xml:
1 24 4.0.0 5 6com.mathxh-webservice 7webservice 80.0.1-SNAPSHOT 9jar 10 11webservice 12Learning WebService 13 1415 20 21org.springframework.boot 16spring-boot-starter-parent 171.5.14.BUILD-SNAPSHOT 1819 22 26 27UTF-8 23UTF-8 241.8 2528 52 5329 32 33org.springframework.boot 30spring-boot-starter 3134 38 39org.springframework.boot 35spring-boot-starter-test 36test 3740 43 44 45org.springframework.boot 41spring-boot-starter-web 4246 50 51org.apache.cxf 47cxf-spring-boot-starter-jaxws 483.1.11 4954 61 6255 6056 59org.springframework.boot 57spring-boot-maven-plugin 5863 80 8164 71spring-snapshots 65Spring Snapshots 66https://repo.spring.io/snapshot 6768 70true 6972 79spring-milestones 73Spring Milestones 74https://repo.spring.io/milestone 7576 78false 7782 99 100 10183 90spring-snapshots 84Spring Snapshots 85https://repo.spring.io/snapshot 8687 89true 8891 98spring-milestones 92Spring Milestones 93https://repo.spring.io/milestone 9495 97false 96
然后开发WebService服务接口并实现接口:
1 package com.mathxhwebservice.webservice.service; 2 3 4 /** 5 * 接口 6 * 7 * @author MathxH Chen 8 * 9 */10 11 import com.mathxhwebservice.webservice.mtom.BinaryFile;12 13 import javax.jws.WebMethod;14 import javax.jws.WebParam;15 import javax.jws.WebResult;16 import javax.jws.WebService;17 import javax.xml.ws.soap.MTOM;18 19 @WebService(name = "CommonService", // 暴露服务名称20 targetNamespace = "http://service.webservice.mathxhwebservice.com/")// 命名空间,一般是接口的包名倒序21 @MTOM(threshold = 1024)22 public interface CommonService {23 24 @WebMethod25 @WebResult(name = "String")26 String sayHello(@WebParam(name = "userName") String name);27 28 @WebMethod29 @WebResult(name ="BinaryFile")30 BinaryFile downloadFile(@WebParam(name = "fileName") String fileName);31 32 @WebMethod33 @WebResult(name = "boolean")34 boolean uploadFile(@WebParam(name = "file") BinaryFile file);35 }
之后是实现WebService接口:
1 package com.mathxhwebservice.webservice.service; 2 3 import com.mathxhwebservice.webservice.mtom.BinaryFile; 4 import org.springframework.stereotype.Component; 5 6 import javax.activation.DataHandler; 7 import javax.activation.DataSource; 8 import javax.activation.FileDataSource; 9 import javax.jws.WebService;10 import java.io.*;11 12 @WebService(serviceName = "CommonService", // 与接口中指定的name一致13 targetNamespace = "http://service.webservice.mathxhwebservice.com/", // 与接口中的命名空间一致,一般是接口的包名倒14 endpointInterface = "com.mathxhwebservice.webservice.service.CommonService"// 接口地址15 )16 @Component17 public class CommonServiceImpl implements CommonService{18 19 @Override20 public String sayHello(String name) {21 return "Hello ," + name;22 }23 24 @Override25 public BinaryFile downloadFile(String fileName){26 BinaryFile file = new BinaryFile();27 file.setTitle(fileName);28 DataSource source = new FileDataSource(new File("d:" + File.separator + fileName));29 file.setBinaryData(new DataHandler(source));30 return file;31 }32 33 @Override34 public boolean uploadFile(BinaryFile file){35 DataHandler dataHandler = file.getBinaryData();36 String fileTitle = file.getTitle();37 38 try (39 InputStream is = dataHandler.getInputStream();40 OutputStream os = new FileOutputStream(new File("d:" + File.separator + fileTitle));41 BufferedOutputStream bos = new BufferedOutputStream(os))42 {43 44 byte[] buffer = new byte[100000];45 int bytesRead = 0;46 while ((bytesRead = is.read(buffer)) != -1) {47 bos.write(buffer, 0, bytesRead);48 }49 50 bos.flush();51 } catch (IOException e) {52 e.printStackTrace();53 return false;54 }55 return true;56 }57 }
然后是配置WebService的发布类:
1 package com.mathxhwebservice.webservice.config; 2 3 import com.mathxhwebservice.webservice.service.CommonService; 4 import org.apache.cxf.Bus; 5 import org.apache.cxf.jaxws.EndpointImpl; 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.context.annotation.Bean; 8 import org.springframework.context.annotation.Configuration; 9 10 import javax.xml.ws.Endpoint;11 12 @Configuration13 public class CxfConfig {14 @Autowired15 private Bus bus;16 17 @Autowired18 CommonService commonService;19 20 /** JAX-WS **/21 @Bean22 public Endpoint endpoint() {23 EndpointImpl endpoint = new EndpointImpl(bus, commonService);24 endpoint.publish("/CommonService");25 26 return endpoint;27 }28 }
最后实现客户端调用(基本调用返回字符串,基于MTOM的上传下载文件):
1 package com.mathxhwebservice.webservice.wsclient; 2 3 import com.mathxhwebservice.webservice.mtom.BinaryFile; 4 import com.mathxhwebservice.webservice.service.CommonService; 5 import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; 6 7 import javax.activation.DataHandler; 8 import javax.activation.DataSource; 9 import javax.activation.FileDataSource; 10 import java.io.*; 11 12 public class CxfClient { 13 public static void main(String[] args) { 14 //cl1(); 15 // downloadTest(); 16 uploadTest(); 17 } 18 19 /** 20 * 方式1.代理类工厂的方式,需要拿到对方的接口 21 */ 22 public static void cl1() { 23 try { 24 // 接口地址 25 String address = "http://localhost:8080/services/CommonService?wsdl"; 26 // 代理工厂 27 JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean(); 28 // 设置代理地址 29 jaxWsProxyFactoryBean.setAddress(address); 30 // 设置接口类型 31 jaxWsProxyFactoryBean.setServiceClass(CommonService.class); 32 // 创建一个代理接口实现 33 CommonService cs = (CommonService) jaxWsProxyFactoryBean.create(); 34 // 数据准备 35 String userName = "MathxH Chen"; 36 // 调用代理接口的方法调用并返回结果 37 String result = cs.sayHello(userName); 38 System.out.println("返回结果:" + result); 39 } catch (Exception e) { 40 e.printStackTrace(); 41 } 42 } 43 44 public static void uploadTest(){ 45 try{ 46 // 接口地址 47 String address = "http://localhost:8080/services/CommonService?wsdl"; 48 // 代理工厂 49 JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean(); 50 // 设置代理地址 51 jaxWsProxyFactoryBean.setAddress(address); 52 // 设置接口类型 53 jaxWsProxyFactoryBean.setServiceClass(CommonService.class); 54 // 创建一个代理接口实现 55 CommonService cs = (CommonService) jaxWsProxyFactoryBean.create(); 56 57 BinaryFile file = new BinaryFile(); 58 file.setTitle("uploaded.png"); 59 DataSource source = new FileDataSource(new File("d:" + File.separator + "downloaded.png")); 60 file.setBinaryData(new DataHandler(source)); 61 if(cs.uploadFile(file)) { 62 System.out.println("upload success"); 63 }else{ 64 System.out.println("upload failed"); 65 } 66 67 }catch (Exception e){ 68 e.printStackTrace(); 69 } 70 } 71 72 public static void downloadTest(){ 73 try{ 74 // 接口地址 75 String address = "http://localhost:8080/services/CommonService?wsdl"; 76 // 代理工厂 77 JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean(); 78 // 设置代理地址 79 jaxWsProxyFactoryBean.setAddress(address); 80 // 设置接口类型 81 jaxWsProxyFactoryBean.setServiceClass(CommonService.class); 82 // 创建一个代理接口实现 83 CommonService cs = (CommonService) jaxWsProxyFactoryBean.create(); 84 85 BinaryFile file = cs.downloadFile("test.png"); 86 String title = file.getTitle(); 87 DataHandler binaryData = file.getBinaryData(); 88 89 try ( 90 InputStream is = binaryData.getInputStream(); 91 OutputStream os = new FileOutputStream(new File("d:" + File.separator + "downloaded.png")); 92 BufferedOutputStream bos = new BufferedOutputStream(os)) 93 { 94 95 byte[] buffer = new byte[100000]; 96 int bytesRead = 0; 97 while ((bytesRead = is.read(buffer)) != -1) { 98 bos.write(buffer, 0, bytesRead); 99 }100 101 bos.flush();102 } catch (IOException e) {103 e.printStackTrace();104 105 }106 107 } catch (Exception e) {108 e.printStackTrace();109 }110 }111 }
references:
http://cxf.apache.org/docs/developing-a-service.html
http://cxf.apache.org/docs/developing-a-consumer.html
http://cxf.apache.org/docs/mtom-attachments-with-jaxb.html
http://yufenfei.iteye.com/blog/1685910
https://blog.csdn.net/accountwcx/article/details/47165321
https://blog.csdn.net/a363722188/article/details/43983959
http://cxf.apache.org/docs/a-simple-jax-ws-service.html
http://cxf.apache.org/docs/jax-ws-configuration.html