繁体   English   中英

JAXB“在此上下文中也不知道其任何超类”,避免使用@XmlSeeAlso

[英]JAXB “nor any of its super class is known to this context” avoid @XmlSeeAlso

说明和解决方法

目前,我正在使用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});

因此,自定义解析器的本质如下所示:

@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);
    }
  }
}

现在,“ 加载适当的上下文数据 ”的处理非常简单。 通过使用运行时数据基本上模仿@XmlSeeAlso

  1. 创建一个自定义内容(注释,处理方法等),以将特定字段/方法标记为“上下文”
  2. 加载字段/方法数据以提取数据类型
  3. 确保您不加载重复项并检查无限递归的可能性

现在,我使用了一些缓存来帮助自己提高效率。 我还为我的根对象创建了一个稍微复杂的设置,该设置实际上是自己跟踪类数据并使其非常快速。 我还创建了一个替代方法,将类标记为“ contextual”,我使用程序包检查通过注释加载该类,并且仅将其自动添加到上下文中,但尚未检查效率。 对于第三次实施,我有一些想法,但我想完成更多的基准测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM