从Jersey资源返回超类

时间:2015-04-10 20:28:19

标签: java rest jersey

我正在做一件非常简单的事情,IMO。我有这样的资源:

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("{nodeType}/{uuid}")
public Object getResourceInfo(@PathParam("nodeType") String nodeType,
                              @PathParam("uuid") String uuid,
                              @Context SecurityContext authority) { ...

注意我返回的是Object类型。这是因为根据调用(这里取决于nodeType参数),我想返回一个不同的具体类(它总是@XmlRootElement)并将其编组到响应中。

然而,这不起作用。我得到例外:

Exception Description: A descriptor for class com.mycompany.XmlElementTypeInstance was not found in the project.  For JAXB, if the JAXBContext was bootstrapped using TypeMappingInfo[] you must call a marshal method that accepts TypeMappingInfo as an input parameter.

如果我将Object更改为单个子类,它就可以工作。但我希望它能够处理任何子类,XmlElementTypeInstance,XmlElementTypeInstance2,etcetc。

我尝试创建一个所有XmlElementTypeInstance子类派生的公共接口,但后来我只在接口中获取这些属性,而不是子类中的额外属性。使用@XmlElementRef并将所有可能的属性添加到公共接口是非常难看的,并且无法正常生成我想要的JSON,所以请不要提示。 =)

有没有办法做到这一点?它似乎是简单,基本,必要的功能......我使用的任何其他REST框架,没问题......

1 个答案:

答案 0 :(得分:2)

结果证明这个解决方案很简单(不过必须阅读JSR而不是实际的Jersey文档!)

将对象设置为实体,而不是返回Object,返回Response(JSR 339的第3.3.3节),强制实现在运行时选择适当的MessageBody {Writer,Reader}。

return Response.ok().entity(<the object>).build();

在这方面失去了太多时间。希望以后可以帮助别人。 = /