使用JAX-WS的maven插件发布webservice
<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ws.student.hqh.com"xmlns:tns="http://ws.student.hqh.com" elementFormDefault="qualified"><xsd:element name="getStudent" type="tns:getStudent" /><xsd:element name="getStudentResponse" type="tns:getStudentResponse" /><xsd:element name="list" type="tns:list" /><xsd:element name="listResponse" type="tns:listResponse" /><xsd:element name="listReward" type="tns:listReward" /><xsd:element name="listRewardResponse" type="tns:listRewardResponse" /><xsd:complexType name="student"><xsd:sequence><xsd:element name="id" type="xsd:int" /><xsd:element name="name" type="xsd:string" /><xsd:element name="sex" type="xsd:string" /><xsd:element name="age" type="xsd:int" /><xsd:element name="number" type="xsd:string" /></xsd:sequence></xsd:complexType><xsd:complexType name="reward"><xsd:sequence><xsd:element name="id" type="xsd:int" /><xsd:element name="year" type="xsd:string" /><xsd:element name="rewardInfo" type="xsd:string" /><xsd:element name="detail" type="xsd:string" /><xsd:element name="student" type="tns:student" /></xsd:sequence></xsd:complexType><xsd:complexType name="getStudent"><xsd:sequence><xsd:element name="number" type="xsd:string" /></xsd:sequence></xsd:complexType><xsd:complexType name="getStudentResponse"><xsd:sequence><xsd:element name="stu" type="tns:student" /></xsd:sequence></xsd:complexType><xsd:complexType name="list"><xsd:sequence /></xsd:complexType><xsd:complexType name="listResponse"><xsd:sequence minOccurs="1" maxOccurs="unbounded"><xsd:element name="students" type="tns:student" /></xsd:sequence></xsd:complexType><xsd:complexType name="listReward"><xsd:sequence><xsd:element name="number" type="xsd:string" /><xsd:element name="date" type="xsd:date" /></xsd:sequence></xsd:complexType><xsd:complexType name="listRewardResponse"><xsd:sequence minOccurs="1" maxOccurs="unbounded"><xsd:element name="rewards" type="tns:reward" /></xsd:sequence></xsd:complexType></xsd:schema>
?
?
wsdl
?
<?xml version="1.0" encoding="UTF-8" standalone="no"?><wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:tns="http://ws.student.hqh.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="StudentWSService"targetNamespace="http://ws.student.hqh.com"><!-- 指定schema --><wsdl:types><xsd:schema targetNamespace="http://ws.student.hqh.com"><!-- <xsd:import schemaLocation="student.xsd" namespace="http://ws.student.hqh.com"/> --><xsd:element name="getStudent" type="tns:getStudent" /><xsd:element name="getStudentResponse" type="tns:getStudentResponse" /><xsd:element name="list" type="tns:list" /><xsd:element name="listResponse" type="tns:listResponse" /><xsd:element name="listReward" type="tns:listReward" /><xsd:element name="listRewardResponse" type="tns:listRewardResponse" /><xsd:complexType name="student"><xsd:sequence><xsd:element name="id" type="xsd:int" /><xsd:element name="name" type="xsd:string" /><xsd:element name="sex" type="xsd:string" /><xsd:element name="age" type="xsd:int" /><xsd:element name="number" type="xsd:string" /></xsd:sequence></xsd:complexType><xsd:complexType name="reward"><xsd:sequence><xsd:element name="id" type="xsd:int" /><xsd:element name="year" type="xsd:string" /><xsd:element name="rewardInfo" type="xsd:string" /><xsd:element name="detail" type="xsd:string" /><xsd:element name="student" type="tns:student" /></xsd:sequence></xsd:complexType><xsd:complexType name="getStudent"><xsd:sequence><xsd:element name="number" type="xsd:string" /></xsd:sequence></xsd:complexType><xsd:complexType name="getStudentResponse"><xsd:sequence><xsd:element name="stu" type="tns:student" /></xsd:sequence></xsd:complexType><xsd:complexType name="list"><xsd:sequence /></xsd:complexType><xsd:complexType name="listResponse"><xsd:sequence minOccurs="1" maxOccurs="unbounded"><xsd:element name="students" type="tns:student" /></xsd:sequence></xsd:complexType><xsd:complexType name="listReward"><xsd:sequence><xsd:element name="number" type="xsd:string" /><xsd:element name="year" type="xsd:string" /></xsd:sequence></xsd:complexType><xsd:complexType name="listRewardResponse"><xsd:sequence minOccurs="1" maxOccurs="unbounded"><xsd:element name="rewards" type="tns:reward" /></xsd:sequence></xsd:complexType></xsd:schema></wsdl:types><!-- 指定方法 --><wsdl:message name="getStudent"><wsdl:part element="tns:getStudent" name="parameters" /></wsdl:message><wsdl:message name="getStudentResponse"><wsdl:part element="tns:getStudentResponse" name="parameters" /></wsdl:message><wsdl:message name="list"><wsdl:part element="tns:list" name="parameters" /></wsdl:message><wsdl:message name="listResponse"><wsdl:part element="tns:listResponse" name="parameters" /></wsdl:message><wsdl:message name="listReward"><wsdl:part element="tns:listReward" name="parameters" /></wsdl:message><wsdl:message name="listRewardResponse"><wsdl:part element="tns:listRewardResponse" name="parameters" /></wsdl:message><!-- 指定接口 --><wsdl:portType name="IStudentWSService"><wsdl:operation name="getStudent"><wsdl:input message="tns:getStudent" /><wsdl:output message="tns:getStudentResponse" /></wsdl:operation><wsdl:operation name="list"><wsdl:input message="tns:list" /><wsdl:output message="tns:listResponse" /></wsdl:operation><wsdl:operation name="listReward"><wsdl:input message="tns:listReward" /><wsdl:output message="tns:listRewardResponse" /></wsdl:operation></wsdl:portType><!-- 指定接口中的方法的参数编码格式 --><wsdl:binding name="studentSOAP" type="tns:IStudentWSService"><soap:binding style="document"transport="http://schemas.xmlsoap.org/soap/http" /><wsdl:operation name="getStudent"><wsdl:input><soap:body use="literal" /></wsdl:input><wsdl:output><soap:body use="literal" /></wsdl:output></wsdl:operation><wsdl:operation name="list"><wsdl:input><soap:body use="literal" /></wsdl:input><wsdl:output><soap:body use="literal" /></wsdl:output></wsdl:operation><wsdl:operation name="listReward"><wsdl:input><soap:body use="literal" /></wsdl:input><wsdl:output><soap:body use="literal" /></wsdl:output></wsdl:operation></wsdl:binding><!-- 指定服务名称、端口、地址 --><wsdl:service name="StudentWSService"><wsdl:port binding="tns:studentSOAP" name="studentServicePort"><soap:address location="http://localhost:8080/stu/ws/" /></wsdl:port></wsdl:service></wsdl:definitions>
?安装插件
<!-- jaxws插件 --><plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>1.9</version> <configuration> <wsdlDirectory>src/main/resources/META-INF/wsdl</wsdlDirectory> <wsdlFiles> <wsdlFile>student.wsdl</wsdlFile> </wsdlFiles> </configuration> <executions> <execution> <phase>compile</phase> <goals> <goal>wsimport</goal> </goals> </execution> </executions></plugin>?
?
接口
package com.hqh.student.ws;import java.util.List;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import javax.xml.ws.RequestWrapper;import javax.xml.ws.ResponseWrapper;import com.hqh.student.model.Reward;import com.hqh.student.model.Student;/** * This class was generated by the JAX-WS RI. * JAX-WS RI 2.1.3-b02- * Generated source version: 2.1 * */@WebService(name = "IStudentWSService", targetNamespace = "http://ws.student.hqh.com")public interface IStudentWSService { /** * * @param number * @return * returns com.hqh.student.ws.Student */ @WebMethod @WebResult(name = "stu", targetNamespace = "") @RequestWrapper(localName = "getStudent", targetNamespace = "http://ws.student.hqh.com") @ResponseWrapper(localName = "getStudentResponse", targetNamespace = "http://ws.student.hqh.com") public Student getStudent( @WebParam(name = "number", targetNamespace = "") String number); /** * * @return * returns java.util.List<com.hqh.student.ws.Student> */ @WebMethod @WebResult(name = "students", targetNamespace = "") @RequestWrapper(localName = "list", targetNamespace = "http://ws.student.hqh.com") @ResponseWrapper(localName = "listResponse", targetNamespace = "http://ws.student.hqh.com") public List<Student> list(); /** * * @param year * @param number * @return * returns java.util.List<com.hqh.student.ws.Reward> */ @WebMethod @WebResult(name = "rewards", targetNamespace = "") @RequestWrapper(localName = "listReward", targetNamespace = "http://ws.student.hqh.com") @ResponseWrapper(localName = "listRewardResponse", targetNamespace = "http://ws.student.hqh.com") public List<Reward> listReward( @WebParam(name = "number", targetNamespace = "") String number, @WebParam(name = "year", targetNamespace = "") String year);}
?
实现类
?
package com.hqh.student.ws;import java.util.List;import javax.jws.WebService;import org.springframework.beans.factory.BeanFactory;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.hqh.student.model.Reward;import com.hqh.student.model.Student;import com.hqh.student.service.StudentService;@WebService(endpointInterface="com.hqh.student.ws.IStudentWSService",serviceName="StudentWSService",portName="studentServicePort",targetNamespace="http://ws.student.hqh.com",wsdlLocation="META-INF/wsdl/student.wsdl")public class StudentWSServiceImpl implements IStudentWSService{private static final BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");public StudentWSServiceImpl() {if(studentService==null) {studentService = factory.getBean(StudentService.class);}}private StudentService studentService;@Overridepublic Student getStudent(String number) {return studentService.getStudent(number);}@Overridepublic List<Student> list() {return studentService.list();}@Overridepublic List<Reward> listReward(String number, String year) {return studentService.listReward(number, year);}}
?
开启服务
?
package com.hqh.student.ws;import javax.xml.ws.Endpoint;public class MyLocalServer {public static void main(String[] args) {Endpoint.publish("http://localhost:8080/stu/ws", new StudentWSServiceImpl());}}
?
客户端模块
同样引入jaxws插件,绑定到compile期间,根据指定的url地址将wsdl转换为java文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.hqh.student</groupId><artifactId>student-client</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>student-client</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><!-- jaxws插件 --><groupId>org.codehaus.mojo</groupId><artifactId>jaxws-maven-plugin</artifactId><version>1.9</version><configuration><wsdlUrls><wsdlUrl>http://localhost:8080/stu/ws?wsdl</wsdlUrl></wsdlUrls></configuration><executions><execution><phase>compile</phase><goals><goal>wsimport</goal></goals></execution></executions></plugin></plugins></build></project>
?执行maven:compile命令,将转换后的文件拷贝到src目录下,新建测试类
?
package com.hqh.ws.test;import java.util.List;import javax.xml.datatype.XMLGregorianCalendar;import org.junit.Test;import com.hqh.student.ws.IStudentWSService;import com.hqh.student.ws.Reward;import com.hqh.student.ws.Student;import com.hqh.student.ws.StudentWSService;public class TestStudent {IStudentWSService iservice = new StudentWSService().getStudentServicePort();@Testpublic void testGetStudent() {Student stu = iservice.getStudent("20130001");System.out.println(stu.getName());}@Testpublic void testList() {List<Student> students = iservice.list();for(Student stu : students) {System.out.println(stu.getName()+","+stu.getSex()+","+stu.getNumber());}}@Testpublic void listReward() {List<Reward> rewards = iservice.listReward("20130002", "2010");for(Reward r : rewards) System.out.println(r.getId()+","+r.getRewardInfo()+","+r.getDetail()+","+r.getStudent().getName());}}
?