JAXB: неправильный префикс пространства имен

pom.xml:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.12.3</version>
    <executions>
        <execution>
            <id>generate-config</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <args>
                    <arg>-Xannotate</arg>
                </args>
                <schemaIncludes>
                    <include>config/main-config.xsd</include>
                    <include>config/status.xsd</include>
                </schemaIncludes>
                <bindingDirectory>src/main/resources/xjb/config</bindingDirectory>
                <bindingIncludes>
                    <bindingInclude>config-bindings.xjb</bindingInclude>
                </bindingIncludes>
                <generateDirectory>target/generated-sources/xjc/config</generateDirectory>
                <generatePackage>com.core.config</generatePackage>
                <packageLevelAnnotations>true</packageLevelAnnotations>
            </configuration>
        </execution>
    </executions>
    <configuration>
        <schemaDirectory>src/main/resources/xsd</schemaDirectory>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.jvnet.hyperjaxb3</groupId>
            <artifactId>maven-hyperjaxb3-plugin</artifactId>
            <version>0.6.0</version>
        </dependency>
    </dependencies>
</plugin>

конфиг-bindings.xjb:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings
        version="2.1"
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:annox="http://annox.dev.java.net"
        jaxb:extensionBindingPrefixes="annox">

    <jaxb:bindings >
        <jaxb:bindings schemaLocation="../../xsd/config/config.xsd" node="/xs:schema">
            <jaxb:bindings node="xs:complexType[@name='Configuration']">
                <annox:annotate>
                    <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="Conf"/>
                </annox:annotate>
            </jaxb:bindings>
        </jaxb:bindings>

        <jaxb:bindings schemaLocation="../../xsd/config/status.xsd" node="/xs:schema">
            <jaxb:bindings node="xs:complexType[@name='StatusInfo']">
                <annox:annotate>
                    <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="Status"/>
                </annox:annotate>
            </jaxb:bindings>
        </jaxb:bindings>

    </jaxb:bindings>

</jaxb:bindings>

Автоматически сгенерированный package-info.java:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.company.com/configuration", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.core.config;

config.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://www.w3.org/2001/XMLSchema"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:cfg="http://www.company.com/configuration"
           targetNamespace="http://www.company.com/configuration"
           elementFormDefault="qualified"
>

    <xs:element name="Conf" type="cfg:Configuration">
        <xs:annotation>
            <xs:documentation>
                Root element for the XML configuration.
            </xs:documentation>
        </xs:annotation>
    </xs:element>

    <xs:complexType name="Configuration">
        //My future Java Bean
    </xs:complexType>

</xs:schema>

status.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://www.w3.org/2001/XMLSchema"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:cfg="http://www.company.com/configuration-status"
           targetNamespace="http://www.company.com/configuration-status"
           elementFormDefault="qualified"
>

    <xs:element name="Status" type="cfg:StatusInfo">
        <xs:annotation>
            <xs:documentation>
                Root element for the XML configuration.
            </xs:documentation>
        </xs:annotation>
    </xs:element>

    <xs:complexType name="StatusInfo">
        //My future Java Bean
    </xs:complexType>

</xs:schema>

я делаю marshaller.marshal(config, writer); и это порождает

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Status xmlns="http://www.company.com/configuration-status" xmlns:ns2="http://www.company.com/configuration">
    <Test></Test>
</ns2:Status>

Когда я делаю unmarshaller.unmarshal(reader);

И получил исключение:

Caused by: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 162; cvc-elt.1: Cannot find the declaration of element 'ns2:Status'.

Поэтому он просто смешал пространства имен и установил неправильный префикс "ns2" для XmlRootElement. Элемент состояния должен указывать на xmlns="http://www.company.com/configuration-status", а не на xmlns: ns2 = "http://www.company.com/configuration". Я не знаю, почему это произошло. Также я попытался жестко закодировать xml вручную, прежде чем демонтировать его и получить аналогичное SAXParseException.

Я играл на разных примерах, как вручную отслеживать пространства имен extends NamespacePrefixMapper и с префиксом extends XMLFilterImpl и / или extends DefaultHandler но, к сожалению, это не помогает мне.

0 ответов

Другие вопросы по тегам