在同一个系统里用cxf 实现SOAP 协议和RESTful风格 两种类型的webservice接口

来源:互联网 发布:vr室内设计软件 编辑:程序博客网 时间:2024/05/17 02:54

1,依赖jar

我的Spring 是4.0.8版本的不同版本之间可能会有冲突,需要耐心的试试

<dependency>    <groupId>org.apache.cxf</groupId>    <artifactId>cxf-rt-frontend-jaxws</artifactId>    <version>3.1.12</version></dependency><dependency>              <groupId>com.fasterxml.jackson.jaxrs</groupId>              <artifactId>jackson-jaxrs-json-provider</artifactId>              <version>2.4.1</version>        </dependency>    <dependency>    <groupId>org.apache.cxf</groupId>    <artifactId>cxf-rt-frontend-jaxws</artifactId>    <version>3.0.3</version></dependency><dependency>    <groupId>org.apache.cxf</groupId>    <artifactId>cxf-rt-transports-http</artifactId>    <version>3.0.3</version></dependency><dependency>    <groupId>org.apache.cxf</groupId>    <artifactId>cxf-rt-frontend-jaxrs</artifactId>    <version>3.0.3</version></dependency><dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId>  <version>3.1.8</version> </dependency>
<dependency>    <groupId>wsdl4j</groupId>    <artifactId>wsdl4j</artifactId>    <version>1.6.2</version></dependency>


2.web.xml配置

 <servlet>  <servlet-name>workerWebSer</servlet-name>  <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  </servlet>    <servlet-mapping>  <servlet-name>workerWebSer</servlet-name>  <url-pattern>/webservice/*</url-pattern>  </servlet-mapping>


3.cxf配置文件

3.1,restFul风格的

<?xml version="1.0" encoding="utf-8"?><!--    规范:xsd      ns:name space --><beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:context="http://www.springframework.org/schema/context"     xmlns:jaxws="http://cxf.apache.org/jaxws"    xmlns:jaxrs="http://cxf.apache.org/jaxrs"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsdhttp://cxf.apache.org/jaxrshttp://cxf.apache.org/schemas/jaxrs.xsd"><!-- 服务发布配置:地址 + 实现类 --><!-- 声明web服务的实现类 --><bean id="workerService" class="com.thinkgem.jeesite.webservice.service.WorkerWebService"></bean><jaxrs:server address="/rest"><jaxrs:serviceBeans><ref bean="workerService"/></jaxrs:serviceBeans>          <!-- 用哪个jar来封装json --> <jaxrs:providers>              <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>          </jaxrs:providers>                 </jaxrs:server></beans>

3.1.1 restFul风格java代码介绍

(我这里介绍的是用json传递消息的)

import java.io.UnsupportedEncodingException;import javax.jws.WebService;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import javax.ws.rs.GET;import javax.ws.rs.PUT;import javax.ws.rs.Path;import javax.ws.rs.PathParam;import javax.ws.rs.Produces;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.transaction.annotation.Isolation;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import  java.net.URLDecoder;import java.util.Date;import java.util.List; @WebService@Path("worker")@Transactional(isolation=Isolation.READ_COMMITTED,propagation=Propagation.REQUIRED ,readOnly=false,rollbackFor=Exception.class)public class WorkerWebService {//工单-系统 基础数据 接口@PUT@Path("/updateBasic")@Produces("application/json;charset=UTF-8")public String updateBasic(BasicWeb webBasic) throws UnsupportedEncodingException {//BasicWeb是用来接收json数据的,我这里是服务端,客户端的BasicWeb应和 这里的BasicWeb一样,否则接收不到//逻辑处理代码return "success";}//restful风格传递数据有四种类型  @GET   @POST  @PUT  @DELETE  客户端代码与之相对应@GET@Path("/query/{id63}")@Produces("application/json;charset=utf-8")public User queryUser(@PathParam("id63")Integer id) {System.out.println("in Server query user:"+id);return new User(id,"中文");}@POST@Path("/add")public void insertUser(User user) {System.out.println("in Server insert User:"+user);}@PUT@Path("/update")public void updateUser(User user) {System.out.println("in Server update User:"+user);}@DELETE@Path("/delete/{id63}")public void deleteUser(@PathParam("id63")Integer id) {System.out.println("in Server delete User:"+id);}}

3.1.2  访问地址:








3.1.3  客户端测试代码,顺便说一下没有找不到jar包可以去mvn官网去下载(怎么下?百度一下)


3.1.3.1jar包


3.1.3.2测试代码

@Testpublic void updateBasic() throws ClientProtocolException, IOException{BasicWeb basicWeb=new BasicWeb();basicWeb.setCode("workorder");  //死值basicWeb.setOrgId("dde8da43712148979534344a99494291");//死值basicWeb.setIdentify("test_name4");//英文String   name=URLEncoder.encode("测试wwwwttt123", "UTF-8");basicWeb.setName(name);String jsonBasicWeb=JSON.toJSONString(basicWeb);System.out.println(jsonBasicWeb);String result = Request.Put("http://localhost:8080/mycrm/webservice/rest/worker/updateBasic/").body(new StringEntity(jsonBasicWeb)).setHeader("content-type","application/json").execute().returnContent().asString(Charset.forName("utf-8"));System.out.println(result);}



3.2,soap协议的配置  

<?xml version="1.0" encoding="utf-8"?><!--    规范:xsd      ns:name space --><beansxmlns="http://www.springframework.org/schema/beans" xmlns:jaxws="http://cxf.apache.org/jaxws"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans                    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd                    http://cxf.apache.org/jaxws                    http://cxf.apache.org/schemas/jaxws.xsd"><!-- web服务实现声明 --><bean id="ws63" class="com.thinkgem.jeesite.webservice.service.CustomerWebServiceImpl"></bean><!-- web服务配置 :服务地址+服务实现  --><jaxws:server address="/customerService"><jaxws:serviceBean><ref bean="ws63"/></jaxws:serviceBean>
<!--  接收报文拦截器,可以自定义接收到报文的格式-->
<jaxws:inInterceptors> <bean class="com.thinkgem.jeesite.webservice.utils.CAbstractPhaseInterceptor"> <constructor-arg> <value>receive</value> </constructor-arg> </bean> </jaxws:inInterceptors>
<!--  发送报文拦截器,可以自定义发送出去报文的格式-->
<!-- <jaxws:outInterceptors> <bean class="com.thinkgem.jeesite.webservice.utils.ArtifactOutInterceptor"/> </jaxws:outInterceptors> --></jaxws:server></beans>

3.2soap协议的java代码

3.2.1接口

import javax.jws.WebMethod;import javax.xml.ws.BindingType;@BindingType("http://schemas.xmlsoap.org/wsdl/soap/http?mtom=true")public interface CustomerWebService { @WebMethod public String receive(String paramString1,String paramString2,String  paramString3);}

3.2.2实现类

@WebServicepublic class CustomerWebServiceImpl implements CustomerWebService{@Autowiredprivate CustomerDao customerDao;public String receive(String paramString1,String paramString2,String  data) {}3.3客户端代码省略,推荐一款好用的工具soapui 工具 来测试    
最后我个人认为用restful风格来写webservice json来传递数据更为方便,不论是客户端还是服务端,soap协议的xml真的繁杂而落后,但两者都需要,赞我一个吧
 
原创粉丝点击