如何创建返回xml以及json的webservice函数?

时间:2012-08-01 23:30:03

标签: java jpa jersey eclipselink jax-rs

我创建了一个Web服务功能:

@GET
@Path("getusers/")
@Produces({"application/xml","application/json"})
public Object getUsers()
{
    String distanceQuery="SELECT UGL.user_id,UP.fname,UGL.mlatitude,UGL.mlogitude,UGL.mlogitude from user_gps_location UGL,user_profile UP where UGL.user_id=UP.user_id";
    Query queryResult=em.createNativeQuery(distanceQuery);

    userList=queryResult.getResultList();
    return userList;
}

该函数返回结果列表: 如果我在选择application / json选项时使用浏览器测试它,它可以正常工作:

结果:

[[1,"Ankit",37.334542,-121.890821,-121.890821],
[1,"Ankit",37.337749,-121.886702,-121.886702],
[1,"Ankit",37.336453,-121.884985,-121.884985],
[1,"Ankit",37.336453,-121.884985,-121.884985],
[1,"Ankit",37.336453,-121.884985,-121.884985],
[1,"Ankit",32.727798,-117.15683,-117.15683],
[1,"Ankit",37.334541666666674,-121.89081999999999,-121.89081999999999],
[1,"Ankit",37.33774833333334,-121.88670166666667,-121.88670166666667],
[1,"Ankit",37.33774833333334,-121.88670166666667,-121.88670166666667],
[1,"Ankit",37.334541666666674,-121.89081999999999,-121.89081999999999],
[1,"Ankit",37.334541666666674,-121.89081999999999,-121.89081999999999],
[1,"Ankit",37.33774833333334,-121.88670166666667,-121.88670166666667],
[2,"Niharika",37.334541666666674,-121.88670166666667,-121.88670166666667],
[2,"Niharika",37.334541666666674,-121.88670166666667,-121.88670166666667]]

但是当我选择“application / xml”时,它会给我一个错误:

javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class java.util.Vector, and Java type class java.util.Vector, and MIME media type application/xml was not found

任何人都可以帮助我并告诉我它有什么问题吗?

另外,我如何能够返回如下形状良好的结果?

<id>1</id>
<name>Ankit</name>

我知道我需要为它使用一个类,但由于这是一个本机查询,我使用两个表并返回结果列表,我不知道该怎么做。

2 个答案:

答案 0 :(得分:2)

尝试更改

public Object getUsers() 

public List<MyObjectType> getUsers()

匹配类型userList。

此外,请确保域类

上存在@XMLRootElement注释

答案 1 :(得分:0)

我曾经遇到过类似的问题。问题的原因是我错过了一些库。 (我无法生成JSON,我错过了jersey-json依赖项)。通过添加依赖项,问题得以解决。

检查是否可以使用这样的简单方法生成XML:

@GET
@Path("test")
@Produces(MediaType.APPLICATION_XML)
public List<String> test()
{
    List<String> test = new ArrayList<String>();
    test.add("string 1");
    test.add("string 2");
    return test;
}

如果您无法使用此方法生成XML,请尝试将jersey-core-1.13添加为Maven依赖项:

<dependency>
    <description></description>
    <groupId>com.sun.jersey</groupId>
    <artefactId>jersey-core</artefactId>
    <version>1.13</version>
</dependency>

如果您可以自由选择使用哪种JAX-RS实现,我强烈建议您查看RESTEasy。它提供了许多很酷的功能,如bean验证,并提供了一个非常易于使用的客户端库。