JAXB:xsd + xjb 到 POJO,无需注释

问题描述 投票:0回答:2

我在尝试将 XSD + XJB 文件转换为代码中没有 JAXB 注释的 POJO 时遇到了困难。

项目结构:

  • pom.xml
  • src/main/resources/schema.xsd

可以在此处找到文件 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/ 下,然后重试。

maven xsd jaxb xjc jaxb2-annotate-plugin
2个回答
0
投票

为了演示 (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 的更新分支。这里使用的演示 schemabinding 是 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>
...

接下来,MainPurchaseOrderTest类各自创建一个带有

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

0
投票

我们更新了 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 版本。

请随意查看我们的迁移指南,因为许多工件已重新定位。

© www.soinside.com 2019 - 2024. All rights reserved.