我使用Jersey和JAXB将我的响应转换为XML。我有几种方法从Request Body中使用XML。我可以将bean指定为被调用方法的参数,JAXB将用于自动将请求主体数据转换为该bean,如果不兼容则会失败。
这适用于我的大多数情况,我没有必要编写MessageBodyReader或MessageBodyWriter来处理转换。我有这个实例,我需要将请求主体映射到bean,但我还需要请求正文中的原始XML。我需要将其存储在数据库中。
我已经尝试通过HttpContext访问请求体,但无法弄清楚 - 我只看到头值和URI值。我尝试了HTTPServletContext,并以相同的结果结束。
有没有办法在转换之前或之后捕获请求正文?我是否需要创建一个MessageBodyReader来处理这种情况?似乎那些用于将内容映射到我已经运行的bean,所以我不认为这是解决方案。但是,也许在MessageBodyReader中,我可以将请求主体放入某个变量并传递它,同时仍然将数据转换为bean。这似乎仍然比需要更多的工作。我想我可以通过请求以某种方式到达身体。
更新 我尝试使用getEntity方法从ContainerRequest对象获取正文。
String xmlString = request.getEntity(String.class);
而且,这很有效。请求主体在该属性中被捕获,我可以将它添加到请求属性以便稍后在资源中访问,等等。问题是,我认为这是因为实体是一个流,它清除了正文。因此,当jaxb映射到bean时,没有任何变换,我收到了错误的请求响应。
这没用,但我想把它扔出去,如果有人能让它更好地工作的话。
这是我最终做的事情,不用这样做会很好。我基本上是在我的服务类中编组解组的内容。
final StringWriter st = new StringWriter();
try
{
final JAXBContext jaxbContext = JAXBContext.newInstance(full.classpath.and.classname.of.root.bean);
final Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(unmarshalled object, st);
} catch (final JAXBException je)
{
// TODO Auto-generated catch block
je.printStackTrace();
}
final String xml = st.toString();
所以你可以看到 - 我基本上把对象,身体被解组的根bean,并封送它,给出了注释的根bean在marhsalling中的位置。
有必要编组已经解组的内容,如果这是响应,那么在出路的时候可能会再次编组。我想要一个解决方案,我可以在解组之前抓住身体的副本。但与此同时,这必须起作用。
答案 0 :(得分:0)
我遇到了相同的场景并以相似的结论结束,除了我通过将其作为字符串然后手动编组来避免不必要的JAXB工作,例如:
String xmlString = request.getEntity(String.class);
Reader sReader = new StringReader(xmlString);
return (T)jaxbCtx.createUnmarshaller().unmarshal(sReader);