JAXB"以及它的任何超类都不为这个背景知道"避免@XmlSeeAlso

时间:2014-08-20 17:22:06

标签: java jaxb jax-rs java-ee-6

解释&解决方法

目前我正在使用JAX-RS并让JAXB绑定自动处理在JEE6项目中将数据转换为XML和JSON。在我尝试创建一个通用响应对象来包装我的所有信息之前,一切都非常有效。

当我尝试使用我的通用响应类com.eln00b.Wrapper(其中包含private Object result属性)时,我得到:

  

javax.xml.bind.MarshalException - 包含链接异常:[com.sun.istack.SAXException2:类com.eln00b.CustomObject或其任何超类都为此上下文所知。 javax.xml.bind.JAXBException:类com.eln00b.CustomObject或其任何超类都为此上下文所知。]

所以我添加到com.eln00b.Wrapper

@XmlSeeAlso ({com.eln00b.CustomObject})
public class Wrapper {
}

一切正常。

问题

我希望这是非常通用的。我不想经常在@XmlSeeAlso类的com.eln00b.Wrapper注释中添加类。 如何让系统自动找到JAXB上下文的所有类?

即使我使用像Reflections之类的东西来加载数据,这也很好。我只是不确定如何在没有@XmlSeeAlso注释的情况下加载所有数据的上下文。有了大量的注释,我将创建它只是根本不起作用。

手动工作方式

只需添加数据即可手动完成手动转换。但是,我想要使用手动XML / JSON创建,除非我绝对需要(我不想处理内容协商或其他任何事情)。

样品:

JAXBContext.newInstance(new Class[] {Wrapper.class, CustomObject.class});

1 个答案:

答案 0 :(得分:2)

所以这就是自定义解析器的本质:

@Provider
@Produces ({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public class JaxbContextResolver implements ContextResolver<JAXBContext> {

  @Override
  public JAXBContext getContext(Class<?> type) {
    // load appropriate context data
    Class[] bindTypes = ...

    // create 
    try {
      return JAXBContext.newInstance(bindTypes);
    } catch (JAXBException e) {
      // todo:  this can be handled better but works for the example
      throw new RuntimeException(e);
    }
  }
}

现在,&#34; 的处理加载适当的上下文数据&#34;很简单。基本上使用运行时数据模仿@XmlSeeAlso

  1. 创建标记特定字段/方法的自定义内容(注释,处理方法,等等)&#34; contextual&#34;
  2. 加载提取数据类型的字段/方法数据
  3. 确保您不加载重复项并检查无限递归可能性
  4. 现在,我使用了一些缓存来帮助自己提高效率。我还为我的根对象创建了一个稍微复杂的设置,它实际上跟踪了它自己的类数据并使其非常快速。我还创建了一个替代方案,将类标记为&#34; contextual&#34;我使用包检查通过注释加载,只是自动添加到上下文但我还没有检查效率。我对第三个实现有一些想法,但我想完成更多的基准测试。