我在尝试将 XSD + XJB 文件转换为代码中没有 JAXB 注释的 POJO 时遇到了困难。
项目结构:
可以在此处找到文件 schema.xsd 作为示例。
我正在使用 Maven 和插件 jaxb2-basics-annotate
这是我的 Maven 文件(pom.xml):
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>xsd-to-pojo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>XSD to Pojo</name>
<properties>
<plugin.version>1.1.0</plugin.version>
<jaxb.version>2.3.1</jaxb.version>
<maven-jaxb2-plugin.version>0.14.0</maven-jaxb2-plugin.version>
</properties>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>${jaxb.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<defaultGoal>compile</defaultGoal>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>${maven-jaxb2-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<encoding>UTF-8</encoding>
<extension>true</extension>
<args>
<arg>-Xannotate</arg>
<arg>-XremoveAnnotation</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics-annotate</artifactId>
<version>${plugin.version}</version>
</plugin>
</plugins>
</configuration>
</plugin>
<plugin>
<inherited>true</inherited>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
当我在命令行上运行命令 mvn 时,我得到以下 Java 文件,在 /target 目录中生成:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "gh16Type", propOrder = {
"x"
})
public class Gh16Type {
protected Object x;
public Object getX() {
return x;
}
public void setX(Object value) {
this.x = value;
}
public boolean isSetX() {
return (this.x!= null);
}
}
@XmlAccessorType 和 @XmlType 应删除。但他们还在那里。
感谢您的帮助!
如果你让它工作,请尝试将文件 binding.xjb 放在 src/main/resources/ 下,然后重试。
为了演示 (zip) 解决方案,this Maven 项目使用 hisrc-higherjaxb-maven-plugin 生成带注释的 JAXB 类;然后,它使用
HiSrc HyperJAXB Annox中的
XremoveAnnotation
插件来 remove 注释,然后使用 ann.xml
资源文件以及 HiSrc BasicJAXB Annox 库在内存中重新绑定 JAXB 上下文.
注意:HiSrc HyperJAXB Annox 项目是 jaxb2-annotate-plugin 的更新分支。这里使用的演示 schema 和 binding 是 OP 旧模式参考的替代品。 免责声明:我是分叉 HiSrc 项目的维护者。
选择性删除JAXB注释是在XJB文件中配置的,这是一个片段:
采购订单.xjb
...
<!-- Items -->
<jaxb:bindings node="xsd:complexType[@name='Items']">
<annox:removeAnnotation target="class" class="jakarta.xml.bind.annotation.XmlAccessorType"/>
<annox:removeAnnotation target="class" class="jakarta.xml.bind.annotation.XmlType"/>
</jaxb:bindings>
...
接下来,Main和PurchaseOrderTest类各自创建一个带有
JAXBContext
的AnnoxAnnotationReader
,用于读取ann.xml
资源文件并重新绑定内存中的注释。因此,生成的 JAXB 类成为 普通旧 Java 对象 (POJO),而上下文是在内存中提供的。
JAXBContext 加上 AnnoxAnnotationReader
RuntimeAnnotationReader annotationReader = new AnnoxAnnotationReader();
Map<String, Object> properties = new HashMap<>();
properties.put(JAXBRIContext.ANNOTATION_READER, annotationReader);
Class<?>[] classes = { ObjectFactory.class };
setJaxbContext(JAXBContext.newInstance(classes, properties));
我们更新了 jaxb-tools 中的 jaxb-annotate-plugin(
org.jvnet.jaxb2.maven2:maven-jaxb2-plugin
的原位置,与 jaxb2-basics、jaxb-annotate-plugin 和其他相关存储库合并),因为您的问题与我们的问题有关在那里填写:https://github.com/highsource/jaxb-tools/issues/340
下一个版本将包括一个新的
RemoveXmlAnnotation
插件,可通过 -XremoveXmlAnnotation
选项激活(以及用于删除 ObjectFactory 类的额外 XremoveXmlAnnotation:removeObjectFactory
选项)。
PR 已创建,实际上正在审核中。如果需要,将能够将其向后移植到插件的 v2 版本。
请随意查看我们的迁移指南,因为许多工件已重新定位。