2017-01-09 8 views
0

У меня есть некоторый контроль над некоторыми из моих схем, поэтому мой вопрос немного отличается от тех, которые похожи на это. У меня есть три схемы, c.xsd импортирует b.xsd, b.xsd импортирует a.xsd. Все три имеют разные пространства имен.Два класса имеют одинаковое имя типа XML maven jaxb plugin, Spring

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns="ANamespace" targetNamespace="ANamespace" version="1.0" jaxb:extensionBindingPrefixes="xjc" jaxb:version="1.0"> 
<xs:complexType name="ClassA"> 
    <xs:sequence> 
     <xs:element name="classAFieldName" type="xs:string" minOccurs="0"> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns="BNamespace" targetNamespace="BNamespace" version="1.0" jaxb:extensionBindingPrefixes="xjc" jaxb:version="1.0"> 


<xs:import namespace="ANamespace" schemaLocation="a.xsd"/> 

<xs:complexType name="ClassB"> 
    <xs:sequence> 
     <xs:element name="classBFieldName" type="xs:string" minOccurs="0"> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns="CNamespace" targetNamespace="CNamespace" version="1.0" jaxb:extensionBindingPrefixes="xjc" jaxb:version="1.0"> 


<xs:import namespace="BNamespace" schemaLocation="b.xsd"/> 

<xs:complexType name="ClassC"> 
    <xs:sequence> 
     <xs:element name="classCFieldName" type="xs:string" minOccurs="0"> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

класса А генерируется в два раза, один раз в org.testing.common и один раз в org.testing.c и оба из них оба имеют одинаковое пространство имен @XmlType (name = "ClassA", namespace = "ANamespace". Однако Spring не знает, какой из них использовать. нужно ли ClassA генерировать дважды?

Вот мой 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/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 

<groupId>com.wfs.fi.stp</groupId> 
<artifactId>testing</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>jar</packaging> 

<name>testing</name> 
<url>http://maven.apache.org</url> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.eclipse.m2e</groupId> 
      <artifactId>lifecycle-mapping</artifactId> 
      <version>1.0.0</version> 
      <configuration> 
       <lifecycleMappingMetadata> 
        <pluginExecutions> 
         <pluginExecution> 
          <pluginExecutionFilter> 
           <groupId>org.jvnet.jaxb2.maven2</groupId> 
           <artifactId>maven-jaxb2-plugin</artifactId> 
           <versionRange>[0.13.1,)</versionRange> 
           <goals> 
            <goal>generate</goal> 
           </goals> 
          </pluginExecutionFilter> 
          <action> 
           <configurator> 
            <id>org.eclipselabs.m2e.jaxb2.connector.Jaxb2JavaProjectConfigurator</id> 
           </configurator> 
          </action> 
         </pluginExecution> 
        </pluginExecutions> 
       </lifecycleMappingMetadata> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.jvnet.jaxb2.maven2</groupId> 
      <artifactId>maven-jaxb2-plugin</artifactId> 
      <version>0.13.1</version> 
      <executions> 
       <execution> 
        <id>A</id> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
        <configuration> 
         <schemaDirectory>src/main/resources</schemaDirectory> 
         <schemaIncludes> 
          <include>a.xsd</include> 
         </schemaIncludes> 
         <bindingIncludes> 
          <include>a.xjb</include> 
         </bindingIncludes> 
         <generatePackage>org.testing.common</generatePackage> 
         <generateDirectory>${project.build.directory}/common_generated</generateDirectory> 
         <episode>true</episode> 
         <episodeFile>${project.build.directory}/common.episode</episodeFile> 
         <extension>true</extension> 
         <verbose>true</verbose> 
         <properties> 
          <property> 
           <name>javax.xml.accessExternalSchema</name> 
           <value>all</value> 
          </property> 
          <property> 
           <name>javax.xml.accessExternalDTD</name> 
           <value>all</value> 
          </property> 
         </properties> 
         <args> 
          <arg>-npa</arg> 
         </args> 
         <disableXmlSecurity>true</disableXmlSecurity> 
         <accessExternalSchema>all</accessExternalSchema> 
         <accessExternalDTD>all</accessExternalDTD> 
        </configuration> 
       </execution> 
       <execution> 
        <id>B</id> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
        <configuration> 
         <schemaDirectory>src/main/resources</schemaDirectory> 
         <schemaIncludes> 
          <include>b.xsd</include> 
         </schemaIncludes> 
         <generatePackage>org.testing.b</generatePackage> 
         <generateDirectory>${project.build.directory}/b_generated</generateDirectory> 
         <bindingIncludes> 
          <include>b.xjb</include> 
         </bindingIncludes> 
         <episode>true</episode> 
         <args> 
          <arg>-b</arg> 
          <arg>${project.build.directory}/common.episode</arg> 
          <arg>-npa</arg> 
         </args> 
         <episodeFile>${project.build.directory}/b.episode</episodeFile> 
         <extension>true</extension> 
         <verbose>true</verbose> 
         <disableXmlSecurity>true</disableXmlSecurity> 
         <accessExternalSchema>all</accessExternalSchema> 
         <accessExternalDTD>all</accessExternalDTD> 
        </configuration> 
       </execution> 

       <execution> 
        <id>C</id> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
        <configuration> 
         <schemaDirectory>src/main/resources</schemaDirectory> 
         <schemaIncludes> 
          <include>c.xsd</include> 
         </schemaIncludes> 
         <generatePackage>org.testing.c</generatePackage> 
         <generateDirectory>${project.build.directory}/c_generated</generateDirectory> 
         <bindingIncludes> 
          <include>c.xjb</include> 
         </bindingIncludes> 
         <args> 
          <arg>-b</arg> 
          <arg>${project.build.directory}/b.episode</arg> 

          <arg>-npa</arg> 
         </args> 
         <plugins> 
          <plugin> 
           <groupId>org.jvnet.jaxb2_commons</groupId> 
           <artifactId>jaxb2-basics</artifactId> 
           <version>0.6.4</version> 
          </plugin> 
         </plugins> 
         <extension>true</extension> 
         <verbose>true</verbose> 
         <disableXmlSecurity>true</disableXmlSecurity> 
         <accessExternalSchema>all</accessExternalSchema> 
         <accessExternalDTD>all</accessExternalDTD> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

ответ

0

Выполнить задачу генерации раз и указать пространство имен для упаковки отображения в вашем файле связывания, а не в плагине конфигурации:

<jaxb:bindings 
     xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd" 
     version="2.1"> 

    <jaxb:bindings schemaLocation="a.xsd"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="org.testing.common"/> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 
    <jaxb:bindings schemaLocation="b.xsd"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="org.testing.b"/> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 
    <jaxb:bindings schemaLocation="c.xsd"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="org.testing.c"/> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 

</jaxb:bindings> 
+0

Это ничего не изменило. ClassA.java генерируется дважды. Вот аннотации для каждого из них: @XmlType (name = "ClassA", namespace = "ANamespace", propOrder = { "classAFieldName" }) - который генерируется в org.testing.common и @XmlType (name = " ClassA ", namespace =" ANamespace ", propOrder = { " classAFieldName " } генерируется в org.testing.c. Проблема Spring заключается в том, что они оба в ANamespace. Пакеты кажутся точными. Кроме того, каждый раз Я ударил ввод в мое редактирование, он представляет редактирование? Как мне обойти это? – noobjob

+0

Удалили ли вы цели _A_ и _B_ и конфигурацию '' Я не знаком с используемым вами плагином , но их страница лучшей практики [предупреждает об использовании «сгенерировать пакет»] (https://github.com/highsource/maven-jaxb2-plugin/wiki/Configure-Target-Packages-in-Binding-Files). – teppic

+0

Хорошо, Я попробовал это (удаление A и B e xecutions и config ), а затем создал один файл привязки для всех пространств имен. Интересно, что все по-прежнему генерируется дважды, но в ClassA/B/C есть имя пакета Java anamespace/bnamespace/cnamespace и атрибут пространства имен NO в аннотации @XmlType. Когда эти файлы игнорируются, я думаю, что Spring не следует путать. Спасибо за вашу помощь! – noobjob