java - 从 XJC 输出中省略 @XmlSeeAlso

标签 java jaxb xjc

目前我正忙于一个使用 XML 消息传递的项目。我有一个通用模式,其中包含抽象类型和一些可重用的类型定义和元素。对于我正在处理的每种消息,都有一个单独的模式(具有不同的目标 namespace )导入通用模式。换句话说,它是一个两级层次结构。很简单。

这些模式中的每一个都用于生成 Java 类。每个模式对应一个包。代码生成由 Maven JAXB 2.1 插件处理。当我使用代码时,我为每种消息类型创建了一个单独的 JAXBContextJAXBContext 是使用通用模式的包名称和特定消息类型的包名称创建的,因此上下文应该只看到它必须处理的那些类。

令我惊讶的是,当我将 XML 文档解码为 bean,然后将它们编码回 XML 时,每种消息类型都有 namespace 声明(= 模式目标 namespace )。想知道 JAXB 如何在上下文范围内获得该信息,我发现一些 @XmlSeeAlso 注释被放置在一些抽象类定义上。这会导致 JAXB 寻找有关目标包之外的类的信息。

有什么方法可以避免生成 @XmlSeeAlso 注释吗?环顾四周,我发现这是 JAXB 2.1 的新功能。我可以切换到 2.0 的 XJC 插件,但我不确定这是否会产生不需要的副作用。另外,我希望在未来继续关注新的 JAXB 版本。不需要的命名空间声明不是问题(XML 仍然有效),但一旦添加了更多消息类型就会造成混淆。此外,这清楚地表明我的 JAXB 上下文加载的类比我想象的要多,并且基本上是彼此重复的。我可以使用一个包含所有上下文的上下文,但我有一个围绕这种分离构建的自己的 API。

感谢阅读和提供的任何答案。

最佳答案

使用父模式和子模式的单独编译。

如果您单独编译父模式(不包括上下文中的子模式),@XmlSeeAlso注释和 {@link ChildType}将只引用该模式及其父级中的 JAXB 类。这实现了父/子模式的明确分离。

使用 maven-jaxb2-plugin,这可以通过限制包含的模式来实现。假设您在文件夹 src/xsd 中有架构 A.xsdB.xsd,其中 B.xsd 导入A.xsd 具有不同的命名空间。要仅生成父级 (​​A.xsd),请使用以下配置:

<plugin>
  <groupId>org.jvnet.jaxb2.maven2</groupId>
  <artifactId>maven-jaxb2-plugin</artifactId>
  <version>0.8.2</version>
  <executions>
    <execution>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <schemaDirectory>${project.basedir}/src/xsd</schemaDirectory>
        <schemaIncludes>
          <include>A.xsd</include>
        </schemaIncludes>
        <episode>true</episode>
      </configuration>
    </execution>
  </executions>
</plugin>

这将为 A.xsd 生成 JAXB 类,而不会引用子架构 B.xsd 中的元素。

因为<episode>true</episode> ,它还会生成一个META-INF/sun-jaxb.episode 文件,您可以在generate the child schemas 时引用该文件。 .

或者,当您生成子架构时(同样,对每个子架构使用单独的编译),如果您不想采用剧集方式,您可以只删除父包。您可以使用 maven-clean-pluginmaven-antrun-plugin 为子代删除额外的父包。我在剧集上遇到了一些麻烦 - 一个额外的 ObjectFactory类是为 child 生成的 - 所以我用这种方式来实现我想要的结构。

另一件需要注意的事情是 JAXBElement<? extends ParentType>生成的类中的引用。如果你做一个单独的编译,XJC 将不知道可能的替换组(如果我没记错的话),并且可能只生成 ParentType。引用。所以如果你需要 JAXBElement引用,添加 <jaxb:property generateElementProperty="true" />该引用的架构或绑定(bind)的属性。

关于java - 从 XJC 输出中省略 @XmlSeeAlso,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7092390/

相关文章:

java - 使用 Core Java 中的递归机制在另一个字符串中查找一个字符串

java - CXF 2.2.12 : How to turn off schema validation on the client side

java - xs :integer produces @XmlElement with "type=String.class" 上的 JAXB javaType 自定义

java - 如何使用 EasyMock 使 java.lang.reflect.Method.getReturnType 返回 void.class ?

java - 无法使用 ClassLoader 加载枚举类

xml - JAXB 是否可以首先通过包含进行编码(marshal),然后通过 @XmlIDREF 进行编码(marshal)以供后续引用?

xml - 复杂扩展 xs :anyType allow textual content?

java - XJC - 它是可扩展的吗?

java - 如何在没有堆栈/正则表达式的情况下检查平衡括号?

java - 将 2 equals JAXB 对象转换为另一个