使用动态创建的类时,RESTEasy无法找到application / xml的Message Body Writer

时间:2014-02-25 16:02:58

标签: java xml maven resteasy cglib

  

无法为类型的响应对象找到MessageBodyWriter:java.util.Array媒体类型列表:application / xml

尝试在动态创建的类/ dtos列表的xml中返回响应时,我收到上述错误。

@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>

1 个答案:

答案 0 :(得分:2)

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

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