無廢話Jersey構建RESTful服務之WebService系統教程 --3 [JAVA對象轉成JSON輸出]


一、 總體說明

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格式里有亂碼問題,以后再解決。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM