1. 程式人生 > >用Jersey構建RESTful服務-JAVA物件轉成XML/Json輸出

用Jersey構建RESTful服務-JAVA物件轉成XML/Json輸出

1、XML資料型別輸出:

一、 總體說明

XML和JSON 是最為常用的資料交換格式。本例子演示如何將java物件,轉成XML輸出。

二、流程

1.在上文的例子中,建立一個包“com.waylau.rest.bean”

2.在該包下建立一個JAVA類"User"

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. package com.waylau.rest.bean;  
  2. import javax.xml.bind.annotation.XmlRootElement;  
  3. /* 
  4.  * 使用者 bean 
  5.  * @author waylau.com 
  6.  * 2014-3-17
     
  7.  */
  8. @XmlRootElement
  9. publicclass User {  
  10.     private String userId;  
  11.     private String userName;  
  12.     private String age;  
  13.     public User() {};  
  14.     public User(String userId, String userName, String age) {  
  15.         this.userId = userId;  
  16.         this.userName = userName;  
  17.         this.age = age;  
  18.     }  
  19.     public String getUserId() {  
  20.         return userId;  
  21.     }  
  22.     publicvoid setUserId(String userId) {  
  23.         this.userId = userId;  
  24.     }  
  25.     public String getUserName() {  
  26.         return userName;  
  27.     }  
  28.     publicvoid setUserName(String userName) {  
  29.         this.userName = userName;  
  30.     }  
  31.     public String getAge() {  
  32.         return age;  
  33.     }  
  34.     publicvoid setAge(String age) {  
  35.         this.age = age;  
  36.     }  
  37. }  
package com.waylau.rest.bean;
import javax.xml.bind.annotation.XmlRootElement;
/*
 * 使用者 bean
 * @author waylau.com
 * 2014-3-17
 */
@XmlRootElement
public class User {
	
	private String userId;
	private String userName;
	private String age;
	
	public User() {};
	
	public User(String userId, String userName, String age) {
		this.userId = userId;
		this.userName = userName;
		this.age = age;
	}
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
}

注意:該類上面增加了一個註解“@XmlRootElement”,在將該類轉化成XML時,說明這個是XML的根節點。

3.在“com.waylau.rest.resources”中,增加資源“UserResource“,程式碼如下:

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. package com.waylau.rest.resources;  
  2. import java.util.ArrayList;  
  3. import java.util.HashMap;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6. import javax.ws.rs.Path;  
  7. import javax.ws.rs.Produces;  
  8. import javax.ws.rs.PathParam;  
  9. import javax.ws.rs.core.MediaType;  
  10. import javax.ws.rs.DELETE;  
  11. import javax.ws.rs.GET;  
  12. import javax.ws.rs.POST;  
  13. import javax.ws.rs.PUT;  
  14. import com.waylau.rest.bean.User;  
  15. @Path("/users")  
  16. publicclass UserResource {  
  17.     privatestatic Map<String,User> userMap = new HashMap<String,User>();//儲存使用者
  18.      /** 
  19.      * 查詢所有 
  20.      * @return 
  21.      */
  22.     @GET
  23.     @Produces(MediaType.APPLICATION_XML)  
  24.     public List<User> getAllUsers(){       
  25.         List<User> users = new ArrayList<User>();  
  26.         User u1 = new User("001","WayLau","26");  
  27.         User u2 = new User("002","King","23");  
  28.         User u3 = new User("003","Susan","21");  
  29.         userMap.put(u1.getUserId(), u1);  
  30.         userMap.put(u2.getUserId(), u2);  
  31.         userMap.put(u3.getUserId(), u3);  
  32.         users.addAll( userMap.values() );  
  33.         return users;  
  34.     }  
  35.     @GET
  36.     @Path("/getUserXml")  
  37.     @Produces(MediaType.APPLICATION_XML)  
  38.     public User getUserXml() {  
  39.      User user  = new User();  
  40.      user.setAge("21");  
  41.      user.setUserId("004");  
  42.      user.setUserName("Amand");  
  43.      return user;  
  44.     }  
  45. }  

其中MediaType.APPLICATION_XML說明了是以XML形式輸出

在瀏覽器輸入http://localhost:8089/RestDemo/rest/users/getUserXml,輸出單個物件

在瀏覽器輸入 http://localhost:8089/RestDemo/rest/users  輸出物件的集合


2、資料輸出為JSON型別:

一、 總體說明

XML和JSON 是最為常用的資料交換格式。本例子演示如何將java物件,轉成JSON輸出。

二、流程

1.在上文專案中,

在“com.waylau.rest.resources.UserResource“中增加程式碼,程式碼如下:

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. @GET
  2. @Path("/getUserJson")    
  3. @Produces(MediaType.APPLICATION_JSON)    
  4. public User getUserJson() {    
  5.  User user  = new User();    
  6.  user.setAge("27");    
  7.  user.setUserId("005");    
  8.  user.setUserName("Fmand");    
  9.  return user;    
  10. }   
    @GET  
    @Path("/getUserJson")  
    @Produces(MediaType.APPLICATION_JSON)  
    public User getUserJson() {  
     User user  = new User();  
     user.setAge("27");  
     user.setUserId("005");  
     user.setUserName("Fmand");  
     return user;  
    } 


MediaType.APPLICATION_JSON 說明輸出的是JSON格式

期望獲取到json的資料,此時,專案報錯

[html] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. 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.  
  2.     at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:247)  
  3.     at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)  
  4.     at org.glassfish.jersey.filter.LoggingFilter.aroundWriteTo(LoggingFilter.java:293)  
  5.     at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)  
  6.     at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:103)  
  7.     at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)  
  8.     at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:88)  
  9.     at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)  
  10.     at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1154)  
  11.     at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:571)  
  12.     at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:378)  
  13.     at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:368)  
  14.     at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:262)  
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。

4. 專案中引入jackson-all-1.9.11.jar

5.在“com.waylau.rest”目錄下建立RestApplication.java

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. package com.waylau.rest;  
  2. import org.codehaus.jackson.jaxrs.JacksonJsonProvider;  
  3. import org.glassfish.jersey.filter.LoggingFilter;  
  4. import org.glassfish.jersey.server.ResourceConfig;  
  5. /** 
  6.  * 應用 
  7.  * @author waylau.com 
  8.  * 2014-3-18 
  9.  */
  10. publicclass RestApplication extends ResourceConfig {  
  11.     public RestApplication() {  
  12.      //服務類所在的包路徑
  13.      packages("com.waylau.rest.resources");  
  14.      //註冊JSON轉換器
  15.      register(JacksonJsonProvider.class);  
  16.     }  
  17. }  
package com.waylau.rest;

import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.server.ResourceConfig;
 
/**
 * 應用
 * @author waylau.com
 * 2014-3-18
 */
public class RestApplication extends ResourceConfig {
    public RestApplication() {
 
     //服務類所在的包路徑
     packages("com.waylau.rest.resources");
     //註冊JSON轉換器
     register(JacksonJsonProvider.class);
 
    }
}


6.修改web.xml,初始化從RestApplicaton進入應用,如下:

[html] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <servlet>
  2.      <servlet-name>Way REST Service</servlet-name>
  3.      <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  4.       <init-param>
  5.            <param-name>javax.ws.rs.Application</param-name>
  6.            <param-value>com.waylau.rest.RestApplication</param-value>
  7.        </init-param>
  8.     <load-on-startup>1</load-on-startup>
  9.   </servlet>
  10.   <servlet-mapping>
  11.     <servlet-name>Way REST Service</servlet-name>
  12.     <url-pattern>/rest/*</url-pattern>
  13.   </servlet-mapping>
<servlet>  
     <servlet-name>Way REST Service</servlet-name>
	 <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
	  <init-param>
	       <param-name>javax.ws.rs.Application</param-name>
	       <param-value>com.waylau.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>