【问题标题】:RESTEasy can't find Message Body Writer for application/xml when using dynamically created class使用动态创建的类时,RESTEasy 找不到 application/xml 的 Message Body Writer
【发布时间】:2014-03-27 23:57:08
【问题描述】:

找不到类型为 java.util.ArrayList 的媒体类型为 application/xml 的响应对象的 MessageBodyWriter

我在尝试以 xml 格式返回动态创建的类/dtos 列表的响应时遇到上述错误。

@GET
@Path("objects")
public Response getObjects(
        @DefaultValue("json") @QueryParam("format") String format)
{    
     GenericEntity entity;

     //I use cglib here to dynamically at runtime create a class called objectDto.
     //The class is just a POJO.

     List<Object> objectsDto = generateObjects(fields);

     entity = new GenericEntity<List<Object>>(objectsDto){};

     Response.ResponseBuilder rBuild;

    if (format.equals("xml"))
    {
        rBuild = Response.ok(entity, MediaType.APPLICATION_XML);
    }
    else
    {
        rBuild = Response.ok(entity, MediaType.APPLICATION_JSON);
    }

    return rBuild.build();
}

奇怪的是我可以返回这个对象的 JSON 表示,但不能返回 XML。我也可以返回非动态创建的类的 XML 表示。

我在我的 Maven 项目中对 resteasy-jaxb-provider 有正确的依赖:

<dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxb-provider</artifactId>
        <version>3.0.6.Final</version>
</dependency>

【问题讨论】:

  • 当你用 cglib 生成你的类时,你是否也会为它们生成 JAXB 注释?
  • 我认为你已经遇到了问题...我需要用 @XmlRootElement 注释我的类...现在要弄清楚如何向类添加注释:) :) 感谢您的帮助兄弟!

标签: java xml maven resteasy cglib


【解决方案1】:

使用开箱即用的 cglib 是不可能的。由于XmlRootElement没有被继承,cglib创建的子类将不再携带这个注解。 Cglib 本身是在注释引入 Java 之前编写的,并且最近没有更新添加此功能。您可以改为使用 cglib 增强器注册 ASM 访问者,该增强器应该负责将注释添加到 cglib 生成的类。

但是,您可能需要考虑使用 javassist 创建您的类,它具有更现代的 API 并支持注释的编写。

【讨论】:

  • 是的,因为@Greg Whitakers 发表评论,我还从其他线程中发现这是不可能的。我现在将研究 javassist,谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-02-17
  • 2012-12-12
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多