我正在使用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: A message body writer for Java type, class java.util.HashMap, and MIME media type, application/json, was not found
Mar 3, 2011 3:32:41 PM com.sun.jersey.server.impl.application.WebApplicationImpl onException
SEVERE: Internal server error
javax.ws.rs.WebApplicationException
有任何想法吗?
解决方法:
在后台,Jersey使用JAXB进行封送处理.首先,如果您没有包含jersey-json工件,那么它将完全不执行JSON.这可能会导致您发布的错误.其次,JAXB使用注释来确定如何对事物进行封送和封送.为了使用JAXB封送对象,必须使用@XmlRootElement注释其类.如果未对类进行注释,Jersey会认为它不知道如何封送对象,并且同样,您将得到相同的错误. .我自己对GenericEntity的使用并不了解100%,但我认为这对您没有帮助.我相信有两种通常可以解决您的问题的解决方案:
>将地图包裹在JAXBElement中.
>用@XmlRootElement注释的地图编写您自己的包装器.
我认为,大多数人倾向于选择第二个选项.您可以在jersey users mailing list archive中找到有关此问题的大量讨论.