2011-03-03 228 views
3

我的RESTful Web服务的工作,我已经写了一个小的RESTful服务,它返回一个JSON数据,这里是我的代码:问题的RESTful Web服务

@Path("/test") 

公共类TestService的{

@GET 
@Produces(MediaType.APPLICATION_JSON) 
public String sayHello() { 
    return "<h6> Hello, Welcome to the world of REST (Plain Text) </h6>"; 
} 
@GET 
@Path("dbdetails") 
@Produces(MediaType.APPLICATION_JSON) 
public Map<String, List> getDBDetails() { 
    System.out.println("ramesh kumar "); 
    List<ProductCategories> list = new ArrayList<ProductCategories>(); 
    HashMap<String,List> map = new HashMap<String,List>(); 
    ProductCategories cat = new ProductCategories(); 
    cat.setId(1); 
    cat.setImage("Image21"); 
    cat.setName("Electronics"); 
    cat.setRowid(111); 
    cat.setType("CatType"); 
    list.add(cat); 
    map.put("Ramesh",list); 
    System.out.println("ramesh kumar "); 
    return map; 

} 

但我得到的错误:

重度:消息正文作家Java类型,类java.util.HashMap中,和MIME媒体类型,应用/ JSO N,没有发现 2011年3月3日下午三时32分41秒com.sun.jersey.server.impl.application.WebApplicationImpl onException的 重度:内部服务器错误 javax.ws.rs.WebApplicationException

有任何想法吗?

+4

你需要想出一个比“平静的web服务问题”更吸引人的标题。 – skaffman 2011-03-03 10:13:26

回答

1

这看起来像类型擦除方案。您应该使用GenericEntity作为返​​回类型。你的代码应该是这样的:

public GenericEntity<Map<String, List>> getDBDetails() { 
. 
. 
. 
     return new GenericEntity<Map<String, List>> (map) {}; 
} 
2

在封面下,Jersey使用JAXB进行封送处理。首先,如果你没有包含jersey-json工件,那么它根本就不会做JSON。这可能会导致您发布的错误。其次,JAXB使用注释来确定如何编组和解组事物。为了使用JAXB编组对象,其类必须注明@XmlRootElement。如果一个课程没有注释,泽西会认为它不知道如何编组这个对象,而且,你会得到同样的错误。我对使用GenericEntity不是100%清楚,自己从未需要它,但我认为这不会对您有所帮助。我相信有两个普遍接受的解决方案可以解决您的问题:

  1. 将您的地图包裹在JAXBElement中。
  2. 为使用@XmlRootElement注释的地图编写自己的包装器。

大多数人倾向于选择第二种选择,我认为。您可以在jersey users mailing list archive中找到关于此问题的大量讨论。

+0

这解决了我与'泽西'问题。但是我没有带'RESTEasy'的'@ XmlRootElement'注释,它仍然有效。我还可以用'Jersey'来避免它,所以我不必编辑我所有的POJO? – 2014-03-11 15:15:26