CXF3.0.2+Spring3.2.14 WebService入门实例五(下)

继续修炼CXF实战之RESTFul服务(下),感觉上半部分只传递了一个xml格式的数据,下半部分在传一个json格式的数据。感觉学习新东西时,有时候会一步成功,大部分是步步不成功,呵呵,人长的太帅容易遭天妒啊!说一点自己的经验,在网上找资料时,尽量找时间比较近的,而且能有配套的的实例最好了,无论有没有实例,一定要自己动手敲一敲代码,自已动手配置一下环境,因为在实际开发或者布署过程中,可能因为操作系统、浏览器不同等等,出现不一样的结果!我写的这几个实例,尽量一次一个实例,互不关联,方便大家查阅下载!

介绍一下开发工具和开发环境,jdk1.6.0_43+Tomcat6.0.29+MyEclipse10.5,没有使用Maven进行管理!

 

一、新建web工程,选择Java EE5.0

 

 

二、新建实体类Person.java

package com.pojo;

 

importjava.io.Serializable;

 

importjavax.xml.bind.annotation.XmlRootElement;

importjavax.xml.bind.annotation.XmlElement;

 

/**

 *

 * 类名:Person.java

 * 作者: 张述飞

 * 创建时间: 2016-1-28下午1:49:34

 * 版本: V1.0

 * 功能描述:

 */

 

@SuppressWarnings("serial")

@XmlRootElement(name= "person")

public classPerson implements Serializable{

       private String id;

       private String name;

       private String desc;

      

       @XmlElement(name = "id")

       public String getId() {

              return id;

       }

       public void setId(String id) {

              this.id = id;

       }

       @XmlElement(name = "name")

       public String getName() {

              return name;

       }

       public void setName(String name) {

              this.name = name;

       }

       @XmlElement(name = "desc")

       public String getDesc() {

              return desc;

       }

       public void setDesc(String desc) {

              this.desc = desc;

       }

      

      

}

三、新建接口类PersonService.java

package com.interfaces;

 

import java.io.Serializable;

import java.util.List;

 

import javax.ws.rs.GET;

import javax.ws.rs.Path;

import javax.ws.rs.PathParam;

import javax.ws.rs.Produces;

import javax.ws.rs.core.MediaType;

 

import com.pojo.Person;

 

 

/**

 *

 * 类名: PersonService.java

 * 作者: 张述飞

 * 创建时间: 2016-1-28下午1:45:00

 * 版本: V1.0

 * 功能描述:

 */

//@Produces({MediaType.APPLICATION_JSON})

@Produces({MediaType.APPLICATION_XML})

publicinterface PersonService extends Serializable {

    @GET

    @Path("/persons")

    public List<Person> getPersons();

   

    @GET

    @Path("/persons/{id}")

    public Person getPerson(@PathParam("id") String id);

}

 

四、新建接口实现类PersonServiceImpl.java

package com.interfaces;

 

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import com.pojo.Person;

 

/**

 *

 * 类名: PersonServiceImpl.java

 * 作者: 张述飞

 * 创建时间: 2016-1-28下午1:46:42

 * 版本: V1.0

 * 功能描述:

 */

publicclass PersonServiceImpl implements PersonService {

    privatestatic finallong serialVersionUID = 1L;

    privatestatic Map<String, Person> ps =new HashMap<String, Person>();

    static {

       Person p1 = new Person();

       p1.setId("001");

       p1.setName("张三");

       p1.setDesc("这是张三");

      

       Person p2 = new Person();

       p2.setId("002");

       p2.setName("李四");

       p2.setDesc("这是李四");

      

       ps.put(p1.getId(), p1);

       ps.put(p2.getId(), p2);

    }

 

    public List<Person> getPersons() {

       returnnew ArrayList<Person>(ps.values());

    }

 

    public Person getPerson(String id) {

       returnps.get(id);

    }

 

}

 

五、新建测试类Client.java

package com.test;

 

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URL;

import java.net.URLConnection;

import java.util.List;

import java.util.Map;

 

/**

 * 测试类

 * 类名: Client.java

 * 作者: 张述飞

 * 创建时间: 2016-1-28下午1:52:25

 * 版本: V1.0

 * 功能描述:

 */

publicclass Client {

 

    publicstatic void main(String[] args)throws Exception {

       URLConnection conn = new URL("http://localhost:8080/WbRest1/v1/persons/001").openConnection();        /**

        *这里做一个说明

        *http://localhost:8080/WbRest1/v1/persons/001

        * WbRest1-工程名

        * v1-版本

        *applicationContext.xml中定义的<jaxrs:server id="restService" address="/v1">

        * PersonService.javapublicPerson getPerson方法中的@Path("/persons/{id}")路径

        */

       HttpURLConnection htconn = (HttpURLConnection)conn;

      

       htconn.setRequestMethod("GET");

       //建立实际的连接

       htconn.connect();

        // 获取所有响应头字段

        Map<String, List<String>>map = htconn.getHeaderFields();

        // 遍历所有的响应头字段

        for (String key : map.keySet()) {

            System.out.println(key +"--->" + map.get(key));

        }

      

       int code = htconn.getResponseCode();

       System.out.println(code);

      

       InputStream is = htconn.getInputStream();

       int len = 0;

       byte[] b =new byte[1024];

      

       StringBuffer sb = new StringBuffer();

       while ((len = is.read(b)) != -1) {

           String s = new String(b,0,len,"UTF-8");

           sb.append(s);

       }

       System.out.println(sb.toString());

       htconn.disconnect();

    }

}

六、这里写几个异常

Exception in thread"main"java.io.IOException: Server returned HTTP response code: 500 for URL:http://localhost:8080/WbRest1/v1/persons/001/

    atsun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

    ………………………………………………………………………………………………………

    atcom.test.Client.main(Client.java:16)

500

这个异常需要导入jackson-jaxrs-json-provider-2.2.3.jar

=============================================================

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'restService': Cannotcreate inner bean'com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider#14753da' of type[com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider] while setting beanproperty 'providers' with key [0]; nested exception isorg.springframework.beans.factory.CannotLoadBeanClassException: Error loading class[com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider] for bean with name'com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider#14753da' defined in classpath resource [applicationContext.xml]: problem with class file or dependentclass; nested exception is java.lang.NoClassDefFoundError:com/fasterxml/jackson/jaxrs/base/ProviderBase

这个异常需要导入jackson-jaxrs-base-2.2.3.jar

=============================================================

警告: Exception encountered during context initialization -cancelling refresh attempt

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'restService': Cannotcreate inner bean 'com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider#b6df89'of type [com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider] while settingbean property 'providers' with key [0]; nested exception isorg.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider]for bean with name'com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider#b6df89' defined in classpath resource [applicationContext.xml]: problem with class file or dependentclass; nested exception is java.lang.NoClassDefFoundError:com/fasterxml/jackson/core/Versioned

这个异常需要导入jackson.core.jar, 这几个异常都差不多,就是提示你需要加载jackson的几个jar包

 

 

七、使用Spring, applicationContext.xml

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:tx="http://www.springframework.org/schema/tx"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"

    xmlns:jaxrs="http://cxf.apache.org/jaxrs"

    xsi:schemaLocation="

    http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsd

    http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsd

    http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsd

    http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsd

    http://cxf.apache.org/transports/http/configurationhttp://cxf.apache.org/schemas/configuration/http-conf.xsd   

    http://cxf.apache.org/jaxrshttp://cxf.apache.org/schemas/jaxrs.xsd">

   

    <importresource="classpath:META-INF/cxf/cxf.xml"/>

    <importresource="classpath:META-INF/cxf/cxf-servlet.xml"/>

    <beanid="personService"class="com.interfaces.PersonServiceImpl"></bean>

    <jaxrs:serverid="restService"address="/v1">

       <jaxrs:serviceBeans>

           <ref bean="personService"/>

       </jaxrs:serviceBeans>

       <jaxrs:inInterceptors>

           <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>

       </jaxrs:inInterceptors>

       <jaxrs:outInterceptors>

           <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>

       </jaxrs:outInterceptors>

       <!--访问json格式的数据,必写!-->

        <jaxrs:providers>

            <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>

        </jaxrs:providers>   

    </jaxrs:server>

</beans>

八、web.xml

<?xmlversion="1.0"encoding="UTF-8"?>

<web-appversion="2.5"

    xmlns="http://java.sun.com/xml/ns/javaee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <display-name></display-name>

  <context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>

          classpath:applicationContext.xml

      </param-value>

  </context-param>

  <listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

  </listener>

  <!--Spring刷新Introspector防止内在泄露-->

  <listener>

    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>

  </listener>

  <servlet>

    <servlet-name>CXFService</servlet-name>

    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

  </servlet>

  <servlet-mapping>

    <servlet-name>CXFService</servlet-name>

    <url-pattern>/*</url-pattern>

  </servlet-mapping>

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

</web-app>

 

九、需导入的jar包

aopalliance-1.0.jar

asm-3.3.1.jar

commons-logging-1.1.3.jar

cxf-core-3.0.7.jar

cxf-manifest.jar

cxf-rt-bindings-soap-3.0.7.jar

cxf-rt-databinding-jaxb-3.0.7.jar

cxf-rt-frontend-jaxrs-3.0.7.jar

cxf-rt-frontend-jaxws-3.0.7.jar

cxf-rt-frontend-simple-3.0.7.jar

cxf-rt-transports-http-3.0.7.jar

cxf-rt-transports-http-jetty-3.0.7.jar

cxf-rt-ws-addr-3.0.7.jar

cxf-rt-ws-policy-3.0.7.jar

cxf-rt-wsdl-3.0.7.jar

geronimo-javamail_1.4_spec-1.7.1.jar

geronimo-jaxws_2.2_spec-1.2.jar

jackson-annotations-2.2.3.jar

jackson-databind-2.2.3.jar

jackson-jaxrs-base-2.2.3.jar

jackson-jaxrs-json-provider-2.2.3.jar

jackson.core.jar

javax.ws.rs-api-2.0.1.jar

jaxb-api-2.2.11.jar

jaxb-core-2.2.11.jar

jaxb-impl-2.2.11.jar

jetty-continuation-8.1.15.v20140411.jar

jetty-http-8.1.15.v20140411.jar

jetty-io-8.1.15.v20140411.jar

jetty-security-8.1.15.v20140411.jar

jetty-server-8.1.15.v20140411.jar

jetty-util-8.1.15.v20140411.jar

neethi-3.0.3.jar

servlet-api.jar

slf4j-api-1.7.9.jar

slf4j-jdk14-1.7.9.jar

spring-aop-3.2.14.RELEASE.jar

spring-beans-3.2.14.RELEASE.jar

spring-context-3.2.14.RELEASE.jar

spring-core-3.2.14.RELEASE.jar

spring-expression-3.2.14.RELEASE.jar

spring-web-3.2.14.RELEASE.jar

stax2-api-3.1.4.jar

woodstox-core-asl-4.4.1.jar

wsdl4j-1.6.3.jar

xmlschema-core-2.2.1.jar

 

十、测试

启动Tomcat服务器,再运行Client.java,

服务器端会显示

2016-1-29 16:34:16org.apache.cxf.interceptor.LoggingInInterceptor

信息: Inbound Message

----------------------------

ID: 1

Address:http://localhost:8080/WbRest1/v1/persons/001

Http-Method: GET

Content-Type:

Headers: {Accept=[text/html,image/gif, image/jpeg, *; q=.2, */*; q=.2], connection=[keep-alive],Content-Type=[null], host=[localhost:8080], user-agent=[Java/1.6.0_43]}

--------------------------------------

2016-1-29 16:34:17 org.apache.cxf.interceptor.LoggingOutInterceptor

信息: Outbound Message

---------------------------

ID: 1

Response-Code: 200

Content-Type: application/xml

Headers:{Content-Type=[application/xml], Date=[Fri, 29 Jan 2016 08:34:16 GMT]}

Payload: <?xmlversion="1.0" encoding="UTF-8"standalone="yes"?><person><desc>这是张三</desc><id>001</id><name>张三</name></person>

--------------------------------------

 

 

在客户端会显示:

null--->[HTTP/1.1 200 OK]

Date--->[Fri, 29 Jan 201608:34:17 GMT]

Transfer-Encoding--->[chunked]

Content-Type--->[application/xml]

Server--->[Apache-Coyote/1.1]

200

<?xmlversion="1.0" encoding="UTF-8"standalone="yes"?><person><desc>这是张三</desc><id>001</id><name>张三</name></person>

 

在IE浏览器中输入http://localhost:8080/WbRest1/v1/persons/001

会显示

  <?xml version="1.0" encoding="UTF-8"standalone="yes" ?>

- <person>

  <desc>这是张三</desc>

  <id>001</id>

  <name>张三</name>

  </person>

 

十一、  将PersonService.java中的注解改为

@Produces({MediaType.APPLICATION_JSON})

启动Tomcat服务器,再运行Client.java,

服务器端会显示

ID: 3

Response-Code: 200

Content-Type: application/json

Headers:{Content-Type=[application/json], Date=[Fri, 29 Jan 2016 08:56:44 GMT]}

Payload:{"id":"001","name":"张三","desc":"这是张三"}

 

在客户端会显示:

null--->[HTTP/1.1 200 OK]

Date--->[Fri, 29 Jan 201608:56:32 GMT]

Transfer-Encoding--->[chunked]

Content-Type--->[application/json]

Server--->[Apache-Coyote/1.1]

200

{"id":"001","name":"张三","desc":"这是张三"}

 

 

【程序员被提bug之后的反应】1.怎么可能;2.在我这是好的,不信你来看看;3.真是奇怪,刚刚还好好的;4.肯定是数据问题;5.你清下缓存试试;6.重启下电脑试试;7.你装的什么版本的类库(jdk)8.这谁写的代码;9.尼玛怎么还在用360安全浏览器或者IEX版本的;10.用户不会像你这么操作的。

 

代码下载地址:

http://download.csdn.net/detail/zhangshufei8001/9422845

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值