当前位置: 移动技术网 > IT编程>开发语言>Java > Spring整合CXF webservice restful实例详解

Spring整合CXF webservice restful实例详解

2019年07月19日  | 移动技术网IT编程  | 我要评论

webservice restful接口跟soap协议的接口实现大同小异,只是在提供服务的类/接口的注解上存在差异,具体看下面的代码,然后自己对比下就可以了。

用到的基础类

user.java

@xmlrootelement(name="user")
public class user {

  private string username;
  private string sex;
  private int age;
  
  public user(string username, string sex, int age) {
    super();
    this.username = username;
    this.sex = sex;
    this.age = age;
  }
  
  public user() {
    super();
  }

  public string getusername() {
    return username;
  }
  public void setusername(string username) {
    this.username = username;
  }
  public string getsex() {
    return sex;
  }
  public void setsex(string sex) {
    this.sex = sex;
  }
  public int getage() {
    return age;
  }
  public void setage(int age) {
    this.age = age;
  }
  
  public static void main(string[] args) throws ioexception {
    system.setproperty("http.proxyset", "true"); 

    system.setproperty("http.proxyhost", "192.168.1.20"); 

    system.setproperty("http.proxyport", "8080");
    
    url url = new url("http://www.baidu.com"); 

    urlconnection con =url.openconnection(); 
    
    system.out.println(con);
  }
}

接下来是服务提供类,phopurestfulservice.java

@path("/phopuservice")
public class phopurestfulservice {


  logger logger = logger.getlogger(phopurestfulserviceimpl.class);

  @get
  @produces(mediatype.application_json) //指定返回数据的类型 json字符串
  //@consumes(mediatype.text_plain) //指定请求数据的类型 文本字符串
  @path("/getuser/{userid}")
  public user getuser(@pathparam("userid")string userid) {
    this.logger.info("call getuser() method...."+userid);
    user user = new user();
    user.setusername("中文");
    user.setage(26);
    user.setsex("m");
    return user;
  }

  @post
  @produces(mediatype.application_json) //指定返回数据的类型 json字符串
  //@consumes(mediatype.text_plain) //指定请求数据的类型 文本字符串
  @path("/getuserpost")
  public user getuserpost(string userid) {
    this.logger.info("call getuserpost() method...."+userid);
    user user = new user();
    user.setusername("中文");
    user.setage(26);
    user.setsex("m");
    return user;
  }
}

web.xml配置,跟soap协议的接口一样

<!-- cxf webservice 配置 -->
  <servlet>
    <servlet-name>cxf-phopu</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.cxfservlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>cxf-phopu</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

spring整合配置

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
  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.xsd
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
    http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
  <import resource="classpath:/meta-inf/cxf/cxf.xml" />
  <import resource="classpath:/meta-inf/cxf/cxf-servlet.xml" />
  <import resource="classpath:/meta-inf/cxf/cxf-extension-soap.xml" />

  <!-- 配置restful json 解析器 , 用cxf自带的jsonprovider需要注意以下几点
  -1、droprootelement 默认为false,则json格式会将类名作为第一个节点,如{customer:{"id":123,"name":"john"}},如果配置为true,则json格式为{"id":123,"name":"john"}。
  -2、dropcollectionwrapperelement属性默认为false,则当遇到collection时,json会在集合中将容器中类名作为一个节点,比如{"customer":{{"id":123,"name":"john"}}},而设置为false,则json格式为{{"id":123,"name":"john"}}
  -3、serializeasarray属性默认为false,则当遇到collecion时,格式为{{"id":123,"name":"john"}},如果设置为true,则格式为[{"id":123,"name":"john"}],而gson等解析为后者
  
  <bean id="jsonproviders" class="org.apache.cxf.jaxrs.provider.json.jsonprovider">
    <property name="droprootelement" value="true" />
    <property name="dropcollectionwrapperelement" value="true" />
    <property name="serializeasarray" value="true" />
  </bean>
 -->
  <!-- 服务类 -->
  <bean id="phopuservice" class="com.phopu.service.phopurestfulservice" />
  <jaxrs:server id="service" address="/">
    <jaxrs:ininterceptors>
      <bean class="org.apache.cxf.interceptor.loggingininterceptor" />
    </jaxrs:ininterceptors>
    <!--servicebeans:暴露的webservice服务类-->
    <jaxrs:servicebeans>
      <ref bean="phopuservice" />
    </jaxrs:servicebeans>
    <!--支持的协议-->
    <jaxrs:extensionmappings>
      <entry key="json" value="application/json"/>
      <entry key="xml" value="application/xml" />
      <entry key="text" value="text/plain" />
    </jaxrs:extensionmappings>
    <!--对象转换-->
    <jaxrs:providers>
      <!-- <ref bean="jsonproviders" /> 这个地方直接用cxf的对象转换器会存在问题,当接口发布,第一次访问没问题,但是在访问服务就会报错,等后续在研究下 -->
      <bean class="org.codehaus.jackson.jaxrs.jacksonjaxbjsonprovider" />
    </jaxrs:providers>
  </jaxrs:server>
  
</beans>

客户端调用示例:

对于get方式的服务,直接在浏览器中输入 就可以直接看到返回的json字符串

{"username":"中文","sex":"m","age":26} 

客户端调用代码如下:

public static void getweatherposttest() throws exception{
    string url = "http://localhost:8080/phopu/services/phopuservice/getuserpost";
    httpclient httpclient = httpclients.createsystem();
    //httpget httpget = new httpget(url); //接口get请求,post not allowed
    httppost httppost = new httppost(url);
    httppost.addheader(content_type_name, "text/plain");
    stringentity se = new stringentity("101010500");
    se.setcontenttype("text/plain");
    httppost.setentity(se);
    httpresponse response = httpclient.execute(httppost);

    int status = response.getstatusline().getstatuscode();
    log.info("[接口返回状态吗] : " + status);

    string weatherinfo = clientutil.getreturnstr(response);

    log.info("[接口返回信息] : " + weatherinfo);
  }

客户端调用返回信息如下:

clientutil类是我自己封装的一个读取response返回信息的类,encoding是utf-8

public static string getreturnstr(httpresponse response) throws exception {
    string result = null;
    bufferedinputstream buffer = new bufferedinputstream(response.getentity().getcontent());
    byte[] bytes = new byte[1024];
    int line = 0;
    stringbuilder builder = new stringbuilder();
    while ((line = buffer.read(bytes)) != -1) {
      builder.append(new string(bytes, 0, line, http_server_encoding));
    }
    result = builder.tostring();
    return result;
  }

到这里,就介绍完了,大家手动去操作一下吧,有问题大家一块交流。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网