我有一个JAX-RS Web服务(使用jersey),它接受一个JAXB对象作为请求实体。当我们收到错误时,我们要记录发送给我们的原始xml字符串。目前,我只是重新编组JAXB对象,但由于我们在这些类中有几个java枚举,原始xml字符串中拼写错误的枚举值将丢失,这对我们来说是不可接受的。
有没有人知道将请求实体作为字符串和JABX对象的方法?我宁愿不编写自定义的MessageBodyReader,如果可能的话,我宁愿不尝试为JAXB获取MessageBodyReader。您也可以自由使用特定于球衣的课程。我们使用的是1.0.x版本。
答案 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过滤器,它将拦截所有请求并将有效负载捕获到线程上下文中,以便在以后可以提取它。