【问题标题】:How to marshal JAXBElement into Response?如何将 JAXBElement 编组为响应?
【发布时间】:2017-01-12 20:59:38
【问题描述】:

我的CXF 提供的REST 服务通常返回javax.ws.rs.core.Response 出于通常的原因,将结果实体数据封送为XML 和返回码:

@GET
@Path("/getPojo")
@Produces("application/xml")
public Response getPojo() {

    SomePojo resultObj = ...;

    Response result = Response.status(200).entity(resultObj).build();

    return result;
}

要求SomePojo 包含正确的注释:

@XmlRootElement(name = "somePojo")
@XmlAccessorType(XmlAccessType.FIELD)
public class SomePojo implements Serializable {
    ...
}

但是,现在我面临一个注释约定对我不起作用的情况,我必须构建自己的JAXBElement。如何在 Response 中包含自定义编组的 JAXBElement,而不是使用依赖注解配置的 Response.ResponseBuilder.entity(resultObj)?我正在编组类似于here 解释的内容,但他只是将编组的 XML 打印到控制台中,我想将其打印到响应中(而不仅仅是 HttpResponse 输出)。

【问题讨论】:

  • 您是要自己编组并直接返回 XML,还是要配置 CXF 以应用自定义编组器您的结果对象?
  • 我不是 100% 确定我理解这个问题,但我的直觉是选择前者,我自己编组但我仍然想使用 Response 因为我想同时封装一个回报代码+对象

标签: java rest jaxb cxf


【解决方案1】:

您可以使用自定义编组器对 xml 进行编组,并将生成的 XML 设置在 Response 的实体中,如 StringInputStream

@GET
@Path("/getXML")
@Produces("application/xml")
public Response getXML() {

    String xml = // custom marshall

    Response result = Response.
           status(200).
           entity(xml).
           type("application/xml").
           build();

    return result;
}

【讨论】:

  • 为什么我们在注解中声明type(application/xml")是必须的?
  • 您正在直接构建响应,而不是 CFX 响应包装器,因此我不确定在这种情况下 CXF 是否会正确更新标头。为了确保我必须审查规范(或测试它)
  • 已审核。在这种情况下,不需要具有单值Produces的方法不需要设置它产生的表示的媒体类型:容器将在发送响应时使用Produces的值。 见docs.oracle.com/javaee/6/api/javax/ws/rs/Produces.html
猜你喜欢
  • 2014-07-30
  • 2012-11-14
  • 1970-01-01
  • 2012-10-04
  • 2019-12-18
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多