使用JAXB在服务层中处理bean

使用JAXB在服务层中处理bean,jaxb,jersey,jax-rs,Jaxb,Jersey,Jax Rs,我使用Jersey和JAXB将响应转换为XML。我有几个方法使用请求体中的XML。我可以将bean指定为被调用方法的参数,JAXB将用于自动将请求体数据转换为该bean,如果不兼容,则会失败 这在我的大多数情况下都非常有效,我不需要编写MessageBodyReader或MessageBodyWriter来处理与之间的转换。我有一个实例,需要将请求体映射到bean,但我还需要请求体中的原始XML。我需要将其存储在数据库中 我试图通过HttpContext访问请求主体,但不知道如何访问——我只看到

我使用Jersey和JAXB将响应转换为XML。我有几个方法使用请求体中的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,并封送它,给出了在marhsalling中使用的注释根bean的位置


这似乎有点令人不安,必须封送那些已经被封送的邮件,如果这是回应,也许会在离开的时候再次封送。我想要一个解决方案,在解组之前我可以抓取尸体的副本。但同时,这也必须起作用。

我遇到了同样的情况,并得出了类似的结论,只是我用另一种方法将其作为字符串,然后手动封送以避免不必要的JAXB工作,例如:

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

我遇到了相同的场景,并得出了类似的结论,只是我用另一种方法将其作为字符串,然后手动封送以避免不必要的JAXB工作,例如:

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

我喜欢这种方法,因为正如您所说,它避免了不必要的JAXB工作。这就是我的方法的问题。我喜欢这种方法,因为正如您所说,它避免了不必要的JAXB工作。这就是我的方法的问题所在。