Mar*_*ger 6 generics jax-rs java-ee-7
我有以下GenericRest类,我用它来扩展基于使用@XmlRootElement注释的Entity类的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();
}
}
Run Code Online (Sandbox Code Playgroud)
将APPLICATION_JSON在目前注释掉情况做工精细,但APPLICATION_XML给错误:
找不到类型的响应对象的MessageBodyWriter:java.util.Array媒体类型列表:application/xml
注释的情况适用于两种MediaTypes,但只返回BaseEntity扩展类的属性,而不是添加的属性.如何获取扩展类的属性并使两个MediaType都有效?
可在此处找到完整的存储库(正在进行中):https://github.com/martijnburger/multitenant
===更新1 ===
我更改@XmlSeeAlso了实体上的注释.这是在特定的实体,但需要在BaseEntity.我进一步使用了GenericList上面的实现.这给出了正确的XML答案.但是,它仍然只返回repsonses中的BaseEntity属性JSON.我有两个后续问题:
JSON包含所请求的特定对象的属性的响应?BaseEntity在添加或删除特定Entity类时不必触及,我更喜欢它.因为@XmlSeeAlso每次添加新Entity类时都需要注释,我需要更新注释.有没有其他方法可以实现这个我不需要触摸的方法BaseEntity?可以在此处找到包含更改的存储库:https://github.com/martijnburger/multitenant/tree/so_36291250
===更新2 ===
我很希望@JsonSubTypes杰克逊的注释可以解决我的问题1.然而,事实并非如此.我使用Jackson注释更新了存储库,但我看不到结果的任何变化.
===更新3 ===
请忽略我的更新2.当使用Jackson 2而不是Jackson 1时,它完全有效.初学者错了.:(这让我有一个问题:每次添加实体时,是否可以在不触及BaseEntity的情况下使其工作.
您可以使用 Jackson,它具有 XML 模块,而不是使用 JAXB for XML。对于 JAX-RS,您将使用此工件1
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-xml-provider</artifactId>
<version>${jackson2.version}</version>
<!-- you'll probably want to use the same version as
the jackson being used on your wildfly -->
</dependency>
Run Code Online (Sandbox Code Playgroud)
如果您使用它,XML 将由 Jackson 处理,它没有 JAXB 那样的一些怪癖。您的所有 Jackson JSON 注释也将与此配合使用,因此您只需要一组注释即可用于 XML 和 JSON。在较低级别,Jackson XML 提供程序使用jackson-dataformat-xml,如果您需要有关它的更多信息。
根据我的测试,只需将工件添加到您的项目中就足以使其工作,尽管我没有在 Wildfly 上进行测试,我只是使用 RESTeasy 本身进行了测试。但我想应该仍然有效。
如果它不能正常工作,我唯一能想象的是 JAXB 提供程序优先于这个提供程序。您可能需要在 jboss-struct.xml 文件中排除resteasy-jaxb-provider。但正如我所说,我认为不需要这样做。我本来想用 Wildfly 进行测试,但我真的不想下载它:-)
OP 使用类路径扫描2来选择自动注册资源和提供程序,但如果您在子Application类中手动注册资源和提供程序,则还需要手动注册JacksonXMLProvider.class(或者JacksonJaxbXMLProvider.class,如果您需要 JAXB 注释支持)。
1 - 链接的项目显示为已弃用,但它链接到未弃用的更高版本。我链接到了已弃用的文档,因为它的自述文件中有一些文档,尽管它很少。较新的项目根本没有文档。
2 - 带有Application注释的空子类@ApplicationPath足以触发类路径扫描。一旦您覆盖getClasses()或getSingletons()并返回非空集,类路径扫描将被禁用。
| 归档时间: |
|
| 查看次数: |
1320 次 |
| 最近记录: |