一、 總體說明
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格式里有亂碼問題,以后再解決。