当前位置: 首页 > 知识库问答 >
问题:

Maven无法使用嵌套模式生成JAXB类

阎晋
2023-03-14

我试图让Maven使用嵌套的xml模式生成JAXB绑定:模式a导入模式B。模式B导入模式C。

如果模式A中的对象引用了模式B中不依赖于模式C对象的对象,那么一切都构建得很好。如果模式B中的对象引用了模式C中的对象,它就会中断。也就是说,深入一层是可行的。去两个深度没有。

只要我在模式A中添加一个引用模式B中对象的对象,而模式B又引用了模式C中的对象,我就会得到一个组织。xml。萨克斯。SAXParseException:rc resolve:无法将名称“schemaB:objectInSchemaB”解析为(n)“类型定义”组件

如果省略顶层模式A,从编译模式B导入模式C开始,我也可以成功地构建。所以,嵌套导入的问题似乎不止一个层次。

我卡住了!

JAXB版本:

检测到JAXB API版本[2.2]。插件:[org.jvnet.jaxb2.maven2:maven-jaxb2-plugin:maven-plugin:0.9.0:,org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-core:jar:0.9.0:compile,com.sun.org.apache.xml.internal:resolver:jar:20050927:compile,org.sonatype.plexus:plexus构建api:jar:0.0.7:compile,junit:junit:junit:junit:jar:jar:jar:4.8.1:compile,org.codehaus.plexus:plexus:plexus:1.5.15:jaxvnet.j。maven2:maven-jaxb22-plugin:jar:0.9.0:compile,javax。xml。bind:jaxbapi:jar:2.2.7:compile,com。太阳xml。bind:jaxb impl:jar:2.2.7:compile,com。太阳xml。bind:jaxb-core:jar:2.2.7:compile,com。太阳istack:istack commons运行时:jar:2.16:compile,com。太阳xml。fastinfoset:fastinfoset:jar:1.2.12:compile,javax。xml。bind:jsr173_api:jar:1.0:compile,com。太阳xml。bind:jaxb-xjc:jar:2.2.7:compile,org。阿帕奇。专家插件工具:maven插件注释:jar:3.2:compile]specVersion:2.2

下面是我的pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>Example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
    <plugins>
        <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                        <schemaIncludes>
                            <schemaInclude>**/*.xsd</schemaInclude>
                        </schemaIncludes>
                        <strict>true</strict>
                        <verbose>true</verbose>
                        <extension>true</extension>
                        <removeOldOutput>true</removeOldOutput>
                        <specVersion>2.2</specVersion>
                        <episode>true</episode>
                        <episodeFile>${project.build.directory}/generated-sources/xjc/META-INF/jaxb-example.episode</episodeFile>
                    </configuration>
                    <id>jaxb-generate-example</id>
                </execution>
            </executions>
            <configuration>
                <catalog>src/main/resources/jaxb/catalog.xml</catalog>
                <catalogResolver>org.jvnet.jaxb2.maven2.resolver.tools.ClasspathCatalogResolver</catalogResolver>
                <forceRegenerate>true</forceRegenerate>
                <generateDirectory>${project.build.directory}/generated-sources/xjc</generateDirectory>
                <verbose>true</verbose>
                <args>
                    <arg>-enableIntrospection</arg>
                </args>
            </configuration>
        </plugin>
    </plugins>
</build>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
</properties>

下面的“图式A”。如果我注释掉basSystemConfig对象,则架构将编译。

 <?xml version="1.0"?>   
 <xsd:schema version="1.0"
           xmlns:xsd="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           targetNamespace="http://ws.zwake.com/schema/zwakkiCentralCommon"
           xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
           xmlns:zwakkiBase="http://ws.zwake.com/schema/zwakeBase"
           jaxb:version="2.1">
    <!-- Schema B import -->
    <xsd:import namespace="http://ws.zwake.com/schema/zwakeBase" schemaLocation="../ZwakeBase/zwakeBase.xsd"/>

    <xsd:annotation>
        <xsd:appinfo>
            <jaxb:globalBindings typesafeEnumMemberName="generateName"/>
        </xsd:appinfo>
    </xsd:annotation> 

    <xsd:element name="RetrieveBaseSystemConfigsRequest">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="credentials" type="zwakkiBase:Credentials"/>
                <xsd:element name="restrictToBaseSystemIds" type="xsd:string" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element> 
    <xsd:element name="RetrieveBaseSystemConfigsResponse">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="baseSystemConfig" type="zwakkiBase:ZwakeConfig" maxOccurs="unbounded"/>
                <xsd:element name="responseStatus" type="zwakkiBase:SystemError" minOccurs="1"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

共有1个答案

司空鸿熙
2023-03-14

我找到了原因:我指向的是嵌套模式中的一个元素,而不是complexType(“编译错误所说的类型”)。这导致了编译失败。我需要使用ref=而不是type=,或者更改模式B的定义。

所以这个问题太明显了,一开始看不见。感谢Xstian确认,否则它应该已经工作。这让我走上了找到它的正确道路。

 类似资料:
  • 使用这个maven插件,我能够生成我的类,并在另一个模式中重用它们;这真是太棒了! 现在我发现自己的模式需要两个插曲(从模式生成的两个不同的包)。我只是简单地尝试在XJC中添加另一个arg,但没有起作用。 然后我更改了两个参数的顺序,错误的目标是另一个模式。然后我明白了,这两集都可以,但这可能不是做事的方式。 以下是我的一些POM: 我得到的是: 新手在这里,任何帮助非常感谢:)。

  • 使用JAXB从XSD(作为标准分发,我无法控制,也无法更改)生成一些POJO有很多困难。问题似乎与XSD中定义某些类型的方式有关。下面我粘贴了一个在XSD中定义的名为TransactionCodeType的简单类型,它是一个令牌与值的枚举列表(也定义为令牌)的联合。 使用JAXB,生成的输出(见下文)被翻译为Java中的基本类型字符串。我使用的是来自org的最新版本的maven-jaxb2-plu

  • 我有一个maven模型项目,我通过maven命令-clean install生成jaxb类,jaxb类在目标文件夹下生成,jar文件在目标文件夹下生成。m2存储库文件夹。 现在在我的另一个项目中,将这个jar添加为具有适当组id和artifactId的依赖项。 但我得到的是生成的jaxb类的ClassNotFoundException和编译错误。 我正在更新我的问题以添加更多细节。 模型项目的Po

  • 有没有办法从Apache spark生成无模式的avro?我可以看到一种使用apache avro库通过Java/Scala和融合avro生成它的方法。当我用下面的方式从Spark编写Avro时,它用模式创建了Avro。我想在没有模式的情况下创建,以减少最终数据集的大小。

  • 抱歉长帖,提前感谢! 在我的JAXB中(代码如下),我有一组值集,其中内部集被包装成一个容器类。所以,我有一组值容器,其中一个值是一个泛型类。问题:除非选择的泛型类是硬编码的,否则值不会得到解析。 关于XML的说明: >