[英]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.