一、 总体说明

XML和JSON 是最为常用的数据交换格式。本例子演示如何将JAVA对象,转换成JSON输出。

 

二、流程

1.在上文项目中,

在“cn.itrush.rest.resources.UserResource“中增加代码,代码如下:

 1 package cn.itrush.rest.resources;  
 2   
 3 import java.util.ArrayList;  
 4 import java.util.HashMap;  
 5 import java.util.List;  
 6 import java.util.Map;  
 7   
 8 import javax.ws.rs.Path;  
 9 import javax.ws.rs.Produces;  
10 import javax.ws.rs.PathParam;  
11 import javax.ws.rs.core.MediaType;  
12 import javax.ws.rs.DELETE;  
13 import javax.ws.rs.GET;  
14 import javax.ws.rs.POST;  
15 import javax.ws.rs.PUT;  
16   
17 import cn.itrush.rest.bean.User;
18 
19 /** 
20  * 回嘉
21  * @author huiqinbo.cn
22  * 2016-8-24
23  */  
24 
25 @Path("/users")  
26 public class UserResource {  
27     private static Map<String,User> userMap = new HashMap<String,User>();//�洢�û�  
28      
29     /** 
30      * 返回多节点XML格式文件
31      * @return 
32      */
33     @GET  
34     @Produces(MediaType.APPLICATION_XML)  
35     public List<User> getAllUsers(){       
36         List<User> users = new ArrayList<User>();  
37         User u1 = new User("001","HuiJia","26");  
38         User u2 = new User("002","Andy","23");  
39         User u3 = new User("003","BoWen","21");  
40           
41         userMap.put(u1.getUserId(), u1);  
42         userMap.put(u2.getUserId(), u2);  
43         userMap.put(u3.getUserId(), u3);  
44           
45         users.addAll( userMap.values() );  
46         return users;  
47     }  
48     
49     
50     /** 
51      * 返回单节点XML格式文件
52      * @return 
53      */
54     @GET  
55     @Path("/getUserXml")  
56     @Produces(MediaType.APPLICATION_XML)  
57     public User getUserXml() {  
58      User user  = new User();  
59      user.setAge("21");  
60      user.setUserId("004");  
61      user.setUserName("回嘉");  
62      return user;  
63     }  
64     
65     /** 
66      * 返回单节点Json格式文件
67      * @return 
68      */
69     @GET
70     @Path("/getUserJson")
71     @Produces(MediaType.APPLICATION_JSON)
72     public User getUserJson(){
73         User user = new User();
74         user.setAge("30");
75         user.setUserId("2");
76         user.setUserName("回嘉");
77         return user;
78     }       
79 }  

注:红色部分为新增J的AVA对象返回JSON 的代码,其它部分是第2节的内容

注:MediaType.APPLICATION_JSON 说明输出的是JSON格式

 

2,运行项目,浏览器输入http://localhost:8080/RestDemo/rest/users/getUserJson

期望获取到json的数据,此时,项目报错

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class com.waylau.rest.bean.User, genericType=class com.waylau.rest.bean.User.  
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:247)  
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)  
    at org.glassfish.jersey.filter.LoggingFilter.aroundWriteTo(LoggingFilter.java:293)  
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)  
    at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:103)  
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)  
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:88)  
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)  
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1154)  
    at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:571)  
    at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:378)  
    at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:368)  
    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:262) 

 

浏览器报错页面显示:

 

 

此时,需要获取json转换包的支持 。

可以由多种方式实现:MOXy、JSON-P、Jackson、Jettison等,本例为Jackson。

3. jackson-all-1.9.11.jar 下载地址我是从CSND(http://download.csdn.net/detail/wind520/5674963)上面下载一个。

4. 项目中引入jackson-all-1.9.11.jar   

注:将jackson-all-1.9.11.jar先放入项目工程的文件夹里,再刷新项目;如果直接放入项目内会报错

 

5.在“cn.itrush.rest”目录下创建RestApplication.java

 

 1 package cn.itrush.rest;  
 2   
 3 import org.codehaus.jackson.jaxrs.JacksonJsonProvider;  
 4 import org.glassfish.jersey.filter.LoggingFilter;  
 5 import org.glassfish.jersey.server.ResourceConfig;  
 6    
 7 /** 
 8  * 回嘉
 9  * @author huiqinbo.cn
10  * 2016-8-24
11  */  
12 public class RestApplication extends ResourceConfig {  
13     public RestApplication() {  
14    
15      //服务类所在的包路径
16      packages("cn.itrush.rest.resources");  
17      //注册JSON转换器  
18      register(JacksonJsonProvider.class);  
19    
20     }  
21 }  

 

 6.修改web.xml,初始化从RestApplicaton进入应用,如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID">
    <display-name>RestDemo</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    
    <servlet>
        <servlet-name>Way REST Service</servlet-name>  
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>  
          <init-param>
                <!-- <param-name>jersey.config.server.provider.packages</param-name>  
                <param-value>cn.itrush.rest.resources</param-value> -->
                <param-name>javax.ws.rs.Application</param-name>
                   <param-value>cn.itrush.rest.RestApplication</param-value>
           </init-param>
       <load-on-startup>1</load-on-startup>  
     </servlet>
     <servlet-mapping>
       <servlet-name>Way REST Service</servlet-name>  
       <url-pattern>/rest/*</url-pattern>  
     </servlet-mapping>
    
      
    
</web-app>

注:注释部分是转换成XML时用的。下面是转换成JSON时用的。

 

7.运行项目,再次访问http://localhost:8080/RestDemo/rest/users/getUserJson
即可输出JSON文本

 

JSON格式里有乱码问题,以后再解决。

 

posted on 2016-08-24 11:31  回嘉  阅读(3755)  评论(2编辑  收藏  举报