【发布时间】:2016-07-17 10:03:03
【问题描述】:
我有以下 GenericRest 类,我用它来扩展基于用 @XmlRootElement 注释的实体类的 rest 类。
public class GenericRest<T extends BaseEntity> {
@Inject @Service
GenericService<T> service;
public GenericService<T> getService() {
return service;
}
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response getAll() {
// This works for JSON but does not work for XML Requests.
List<T> list = getService().findAll();
// This just gives the attributes for the BaseEntity.
//GenericEntity<List<T>> list = new GenericEntity<List<T>>(getService().findAll()) {};
return Response.ok(list).build();
}
}
APPLICATION_JSON 在当前未注释的情况下工作正常,但APPLICATION_XML 给出错误:
找不到响应对象类型的 MessageBodyWriter: 媒体类型的java.util.ArrayList:application/xml
注释的情况适用于两种 MediaType,但仅返回 BaseEntity 的属性,而不是扩展类的添加属性。如何获取扩展类的属性和两种 MediaType 都可以工作?
完整的存储库可以在这里找到(正在进行中):https://github.com/martijnburger/multitenant
=== 更新 1 ===
我更改了实体上的@XmlSeeAlso 注释。它在特定实体上,但需要在 BaseEntity 上。此外,我使用了上面的GenericList 实现。这给出了正确的XML 响应。但是,它仍然只返回JSON 响应中的BaseEntity 属性。我有两个后续问题:
- 如何返回
JSON响应,其中包括所请求的特定对象的属性? - 如果在添加或删除特定的
Entity类时不必触摸BaseEntity,我会更喜欢它。因为@XmlSeeAlso注解每次新增Entity类,都需要更新注解。是否有另一种方法可以在我不需要触摸BaseEntity的情况下实现这一点?
可以在此处找到包含更改的存储库:https://github.com/martijnburger/multitenant/tree/so_36291250
=== 更新 2 ===
我非常希望来自 Jackson 的 @JsonSubTypes 注释能够解决我的问题 1。但是,它没有。我使用 Jackson 注释更新了存储库,但在结果中看不到任何更改。
=== 更新 3 ===
请忽略我的更新 2。使用 Jackson 2 而不是 Jackson 1 时它完全有效。初学者错误。 :( 这给我留下了一个问题:每次添加实体时是否可以在不接触 BaseEntity 的情况下使其正常工作。
【问题讨论】:
-
The
GenericEntityis needed。至于实体,您是否尝试将@XmlSeeAlso放在BaseEntity类上,指向子类,即@XmlSeeAlso({Car.class, Customer.class})? -
啊!让我试试。我假设扩展类需要
@XmlSeeAlse。但是,我希望每次添加实体时都不必触摸 BaseEntity。 -
几乎很有趣。此更改适用于 XML 请求,但如果我尝试 JSON 请求,它仍然只返回 BaseEntity 属性。此处更新分支:github.com/martijnburger/multitenant/tree/so_36291250
-
那么你是说在添加这个之前,JSON 产生了正确的结果?当您在评论中使用 "still" 一词时,我有点困惑,但在您的帖子中,您是说 JSON 产生正确的输出?
-
它没有 GenericEntity 包装器。使用 GenericEntity 包装器,它只为 BaseEntity 生成属性。