JAX-RS如何将实体作为JAXB对象和字符串获取

4
我有一个JAX-RS Web服务(使用Jersey),接受一个JAXB对象作为请求实体。当发生错误时,我们想要记录发送给我们的原始XML字符串。目前,我只是重新编组JAXB对象,但由于这些类中有几个Java枚举,因此在原始XML字符串中拼写不正确的枚举值会丢失,这对我们来说是不可接受的。
有人知道一种既可以将请求实体作为字符串又可以作为JABX对象获取的方法吗?如果可能的话,我宁愿不编写自定义MessageBodyReader,也不想尝试获取JAXB的MessageBodyReader。您可以自由地使用Jersey特定的类。我们使用的是1.0.x版本。
2个回答

2
事实证明,使用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();
    }
}

这将让你在几行代码中以字符串和JAXB对象的形式获得xml。

0
作为一个想法,您可以为您的Web应用程序添加一个Servlet过滤器,拦截所有请求并将有效负载捕获到线程上下文中,以便稍后如果需要可以从中提取。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接