4

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

有谁知道将请求实体作为字符串和 JABX 对象获取的方法?我宁愿不编写自定义 MessageBodyReader,并且如果可能的话,我宁愿不尝试获取 JAXB 的 MessageBodyReader。您也可以自由使用特定于球衣的课程。我们使用的是 1.0.x 版本。

4

2 回答 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();
    }
}

这将在几行代码中将 xml 作为字符串和 JAXB 对象提供给您。

于 2009-12-04T18:22:43.470 回答
0

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

于 2009-12-03T01:52:56.850 回答