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
но, к сожалению, это не помогает мне.