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

时间:2009-12-01 20:04:12

标签: java jersey jax-rs

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

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

2 个答案:

答案 0 :(得分: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对象。

答案 1 :(得分:0)

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