繁体   English   中英

JAX-RS获取实体作为JAXB对象和String

[英]JAX-RS get entity as JAXB object and as String

我有一个JAX-RS Web服务(使用球衣),它接受JAXB对象作为请求实体。 遇到错误时,我们想记录发送给我们的原始xml字符串。 当前,我只是在重新编组JAXB对象,但是由于这些类中有几个Java枚举,因此丢失了原始xml字符串中拼写错误的枚举值,这对于我们的目的是不可接受的。

有谁知道将请求实体同时作为字符串和JABX对象的方法? 我宁愿不编写自定义MessageBodyReader,也不愿尽可能地获取JAXB的MessageBodyReader。 您也可以自由使用球衣特定的类。 我们正在使用版本1.0.x。

事实证明,使用JAX-RS API并不难。 这是我所做的:

@Path("/transactions")
public class TestResource<X> {

    private Class<X> jaxbClass;

    @POST
    @Path("/{transaction-id}")
    @Consumes("application/xml")
    public Response processPost(@Context Providers providers, @Context HttpHeaders httpHeaders, @PathParam("transaction-id") final long transactionId,
            final String xmlString) throws WebApplicationException, IOException {

        MessageBodyReader<X> reader = providers.getMessageBodyReader(jaxbClass, null, null, MediaType.APPLICATION_XML_TYPE);
        InputStream entityStream = new ByteArrayInputStream(xmlString.getBytes());
        final X xmlObject = reader.readFrom(jaxbClass, null, null, MediaType.APPLICATION_XML_TYPE, httpHeaders.getRequestHeaders(), entityStream);

        //insert logic here

        return Response.ok().build();
    }
}

这将使您仅用几行代码就可以将XML作为字符串和JAXB对象。

可以为您的Web应用程序添加一个Servlet过滤器,该过滤器将拦截所有请求并将有效负载捕获到线程上下文中,然后在需要时从中提取该有效负载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM