用Jersey构建RESTful服务-JAVA对象转成XML/Json输出

1、XML数据类型输出:

一、 总体说明

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

二、流程

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

2.在该包下创建一个JAVA类"User"

  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. public class User {  
  10.       
  11.     private String userId;  
  12.     private String userName;  
  13.     private String age;  
  14.       
  15.     public User() {};  
  16.       
  17.     public User(String userId, String userName, String age) {  
  18.         this.userId = userId;  
  19.         this.userName = userName;  
  20.         this.age = age;  
  21.     }  
  22.     public String getUserId() {  
  23.         return userId;  
  24.     }  
  25.     public void setUserId(String userId) {  
  26.         this.userId = userId;  
  27.     }  
  28.     public String getUserName() {  
  29.         return userName;  
  30.     }  
  31.     public void setUserName(String userName) {  
  32.         this.userName = userName;  
  33.     }  
  34.     public String getAge() {  
  35.         return age;  
  36.     }  
  37.     public void setAge(String age) {  
  38.         this.age = age;  
  39.     }  
  40. }  
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“,代码如下:

  1. package com.waylau.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 com.waylau.rest.bean.User;  
  18.   
  19. @Path("/users")  
  20. public class UserResource {  
  21.     private static Map<String,User> userMap = new HashMap<String,User>();//存储用户  
  22.      /** 
  23.      * 查询所有 
  24.      * @return 
  25.      */  
  26.     @GET  
  27.     @Produces(MediaType.APPLICATION_XML)  
  28.     public List<User> getAllUsers(){       
  29.         List<User> users = new ArrayList<User>();  
  30.         User u1 = new User("001","WayLau","26");  
  31.         User u2 = new User("002","King","23");  
  32.         User u3 = new User("003","Susan","21");  
  33.           
  34.         userMap.put(u1.getUserId(), u1);  
  35.         userMap.put(u2.getUserId(), u2);  
  36.         userMap.put(u3.getUserId(), u3);  
  37.           
  38.         users.addAll( userMap.values() );  
  39.         return users;  
  40.     }  
  41.       
  42.     @GET  
  43.     @Path("/getUserXml")  
  44.     @Produces(MediaType.APPLICATION_XML)  
  45.     public User getUserXml() {  
  46.      User user  = new User();  
  47.      user.setAge("21");  
  48.      user.setUserId("004");  
  49.      user.setUserName("Amand");  
  50.      return user;  
  51.     }  
  52.       
  53.    
  54.      
  55. }  

其中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“中增加代码,代码如下:

  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格式

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

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

  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。

3. jackson-all-1.9.11.jar 下载地址http://wiki.fasterxml.com/JacksonDownload

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

5.在“com.waylau.rest”目录下创建RestApplication.java

  1. package com.waylau.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 waylau.com 
  10.  * 2014-3-18 
  11.  */  
  12. public class RestApplication extends ResourceConfig {  
  13.     public RestApplication() {  
  14.    
  15.      //服务类所在的包路径  
  16.      packages("com.waylau.rest.resources");  
  17.      //注册JSON转换器  
  18.      register(JacksonJsonProvider.class);  
  19.    
  20.     }  
  21. }  
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进入应用,如下:

  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.        
  9.     <load-on-startup>1</load-on-startup>  
  10.   </servlet>  
  11.     
  12.   <servlet-mapping>  
  13.     <servlet-name>Way REST Service</servlet-name>  
  14.     <url-pattern>/rest/*</url-pattern>  
  15.   </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>

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值