Restful WebService的问题

时间:2011-03-03 10:07:32

标签: java jersey jax-rs

我正在使用RestFul Webservice,我写了一个小的restful服务,它返回一个json数据,这是我的代码:

@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;

}

但我收到错误:

  

SEVERE:找不到Java类型的消息正文编写器,类java.util.HashMap和MIME媒体类型application / json   2011年3月3日下午3:32:41 com.sun.jersey.server.impl.application.WebApplicationImpl onException   严重:内部服务器错误   javax.ws.rs.WebApplicationException

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

  1. 将地图包裹在JAXBElement
  2. 为地图编写自己的包装器,并使用@XmlRootElement注释。
  3. 我认为大多数人倾向于选择第二种选择。您可以在jersey users mailing list archive

    中找到关于此问题的大量讨论

答案 1 :(得分:1)

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

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