使用JAXB来编组服务层中的bean

时间:2012-03-15 15:07:30

标签: jaxb jersey jax-rs

我使用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中的位置。

有必要编组已经解组的内容,如果这是响应,那么在出路的时候可能会再次编组。我想要一个解决方案,我可以在解组之前抓住身体的副本。但与此同时,这必须起作用。

1 个答案:

答案 0 :(得分:0)

我遇到了相同的场景并以相似的结论结束,除了我通过将其作为字符串然后手动编组来避免不必要的JAXB工作,例如:

String xmlString = request.getEntity(String.class);
Reader sReader = new StringReader(xmlString);
return (T)jaxbCtx.createUnmarshaller().unmarshal(sReader);    
相关问题