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

猜你喜欢

转载自zhangshufei8001.iteye.com/blog/2377300
今日推荐