Java 从Jersey资源返回超类
我正在做一件非常简单的事情,我想这应该行得通。我有这样一个资源:Java 从Jersey资源返回超类,java,rest,jersey,Java,Rest,Jersey,我正在做一件非常简单的事情,我想这应该行得通。我有这样一个资源: @GET @Produces(MediaType.APPLICATION_JSON) @Path("{nodeType}/{uuid}") public Object getResourceInfo(@PathParam("nodeType") String nodeType, @PathParam("uuid") String uuid,
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("{nodeType}/{uuid}")
public Object getResourceInfo(@PathParam("nodeType") String nodeType,
@PathParam("uuid") String uuid,
@Context SecurityContext authority) { ...
注意,我正在返回类型对象。这是因为根据调用(这里取决于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.
如果我将对象更改为单个子类,它就会工作。但我希望它能够处理任何子类,XmlElementTypeInstance,XmlElementTypeInstance2,等等
我尝试创建一个公共接口,所有XmlElementTypeInstance子类都是从该接口派生的,但是我只在接口中获得这些属性,而不是子类中的额外属性。使用@XmlElementRef并将所有可能的属性添加到公共接口非常难看,无法正确生成我想要的JSON,因此请不要建议这样做。=)
有没有办法做到这一点?它似乎是简单、基本、必要的功能。。。我使用过的任何其他REST框架,都没有问题……结果证明,解决方案很简单(不过,必须阅读JSR而不是实际的Jersey文档!) 将对象设置为实体并返回响应(JSR339的第3.3.3节)将强制实现在运行时选择适当的MessageBody{Writer,Reader},而不是返回对象
return Response.ok().entity(<the object>).build();
返回Response.ok().entity().build();
在这件事上浪费了太多时间。希望以后能对别人有所帮助=/ 我建议返回一个
字符串
并手动解析对象,或者返回一个表示您想要/需要公开的数据的映射
。如果我正在做这两件事中的任何一件,我可能会将Jersey踢到路边,自己写出JSONObject并在低级操作容器响应对象。不,那不是答案。我想要JAXB映射的对象。那么,欢迎来到JAXB的一个常见问题/限制。那么你是说:Jersey不仅不支持这种开箱即用的方法,而且整个JAXB规范使它绝对不可能实现?我觉得很难相信。。。每个JAXB容器中的每个服务是否只返回一个类类型?