2017-10-27 2 views
0

저는 제어 할 수없는 여러 XML 스키마가 있으며 XJC를 통해 Java 클래스를 생성 할 때 특정 사용자 정의를 적용하려고합니다.JAXB는 하나 이상의 .xsd 스키마에 바인딩을 적용합니다.

일부 맞춤 설정은 모든 .xsd 파일에 적용되어야하지만이를 달성하는 방법을 잘 모르겠습니다.

<jxb:bindings version="2.1" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance" 
    jxb:extensionBindingPrefixes="inheritance"> 

    <jxb:bindings schemaLocation="../schemas/A.xsd"> 
     <jxb:schemaBindings> 
      <jxb:package name="my.foo.a" /> 
     </jxb:schemaBindings> 

     <jxb:bindings node="//xs:complexType[@name='A']"> 
      <jxb:class name="A" /> 
      <inheritance:implements>my.foo.interfaces.IA</inheritance:implements>   
     </jxb:bindings> 

     <jxb:bindings node="//xs:complexType[@name='Device']"> 
      <jxb:class name="Device" /> 
      <inheritance:implements>my.foo.interfaces.IDevice</inheritance:implements>   
     </jxb:bindings>    
    </jxb:bindings> 

    <jxb:bindings schemaLocation="../schemas/B.xsd">   
     <jxb:schemaBindings> 
      <jxb:package name="my.foo.b" /> 
     </jxb:schemaBindings> 

     <jxb:bindings node="//xs:complexType[@name='B']"> 
      <jxb:class name="B" /> 
      <inheritance:implements>my.foo.interfaces.IB</inheritance:implements>  
     </jxb:bindings> 

     <jxb:bindings node="//xs:complexType[@name='Device']"> 
      <jxb:class name="Device" /> 
      <inheritance:implements>my.foo.interfaces.IDevice</inheritance:implements>   
     </jxb:bindings>    
    </jxb:bindings>  
</jxb:bindings> 

그리고이 Ant 태스크 : 순간

나는이 .xjb 파일이 어떻게 든 일반 블록 (지정하는 것입니다 싶은 것이 마지막

<taskdef name="xjc" classname="org.jvnet.jaxb2_commons.xjc.XJC2Task"> 
    <classpath> 
     <fileset dir="../../dependencies/lib" > 
      <include name="activation-*.jar"/> 
      <include name="jaxb-api-*.jar"/> 
      <include name="jaxb-impl-*.jar"/> 
      <include name="jsr173_api-*.jar"/> 
      <include name="stax-api-*.jar"/> 

      <include name="jaxb2-basics-jaxb-xjc-*.jar"/> 
      <include name="jaxb-xjc-*.jar"/> 
      <include name="jaxb2-basics-ant-*.jar"/> 
     </fileset> 
    </classpath> 
</taskdef> 

<xjc destdir="../src" extension="true" header="false" binding="bindings.xjb"> 
    <arg line="-Xinheritance"/> 

    <schema dir="../schemas"> 
     <include name="*.xsd"/> 
     <exclude name="Foo.xsd"/> 
    </schema> 

    <!-- Plugins --> 
    <classpath> 
     <fileset dir="../../dependencies/lib"> 
      <!-- JAXB2 Basics library --> 
      <include name="jaxb2-basics-*.jar"/> 
      <!-- JAXB2 Basics library dependencies --> 
      <include name="jaxb2-basics-runtime-*.jar"/> 
      <include name="jaxb2-basics-tools-*.jar"/> 
      <include name="javaparser-*.jar"/> 
      <include name="commons-beanutils-*.jar"/> 
      <include name="commons-lang-*.jar"/> 
      <include name="commons-logging-*.jar"/> 
     </fileset> 
    </classpath> 
</xjc> 

을하는의 I 두 개 이상 있음) :

<jxb:bindings node="//xs:complexType[@name='Device']"> 
    <jxb:class name="Device" /> 
    <inheritance:implements>my.foo.interfaces.IDevice</inheritance:implements>   
</jxb:bindings> 

내 모든 .xsd 파일 에스.

꼽은 이런 식으로 뭔가 :

<jxb:bindings version="2.1" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance" 
    jxb:extensionBindingPrefixes="inheritance"> 

    <jxb:bindings schemaLocation="../schemas/*.xsd"> 
     <jxb:bindings node="//xs:complexType[@name='Device']"> 
      <jxb:class name="Device" /> 
      <inheritance:implements>my.foo.interfaces.IDevice</inheritance:implements>   
     </jxb:bindings> 
    </jxb:bindings> 

    <jxb:bindings schemaLocation="../schemas/A.xsd"> 
     <jxb:schemaBindings> 
      <jxb:package name="my.foo.a" /> 
     </jxb:schemaBindings> 

     <jxb:bindings node="//xs:complexType[@name='A']"> 
      <jxb:class name="A" /> 
      <inheritance:implements>my.foo.interfaces.IA</inheritance:implements>   
     </jxb:bindings>   
    </jxb:bindings> 

    <jxb:bindings schemaLocation="../schemas/B.xsd">   
     <jxb:schemaBindings> 
      <jxb:package name="my.foo.b" /> 
     </jxb:schemaBindings> 

     <jxb:bindings node="//xs:complexType[@name='B']"> 
      <jxb:class name="B" /> 
      <inheritance:implements>my.foo.interfaces.IB</inheritance:implements>  
     </jxb:bindings>  
    </jxb:bindings>  
</jxb:bindings> 

가 어떻게 이러한 목표를 달성 할 수 있습니까?

답변

0

그래서, 여기에이 응답을 사용하여 (대부분)에 대한 : https://stackoverflow.com/a/18592030/770023

내가 스키마 작업을 얻는 것을 처리 한 참조를 위해 모든 스키마를 읽기 위해 (schemaLocation="*" 설정하기 만하면 물론) 일부 스키마에는 이러한 요소가 포함될 수 있으므로 (한 번 이상) 어떤 요소는 전혀 포함되지 않을 수 있으므로 바인딩 요소에 multiple="true"required="false"으로 표시하십시오.

<jxb:bindings version="2.1" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance" 
    jxb:extensionBindingPrefixes="inheritance"> 

    <jxb:bindings schemaLocation="*"> 
     <jxb:bindings node="//xs:complexType[@name='Device']" multiple="true" required="false"> 
      <inheritance:implements>my.foo.interfaces.IDevice</inheritance:implements>   
     </jxb:bindings> 
    </jxb:bindings> 
    <!-- rest of the bindings (per schema ones) go here --> 
</jxb:bindings> 

이유를 (나에게 알 수없는) 일부 있다는 점 유의 하시길 바랍니다 나는 XJC에 의해 허용되는 파일의 class 바인딩 (예. <jxb:class name="Device" />)를 제거했다. 내가 작업을 얻을 수 없었던 제가 주로 작업

는 ...

implements과 동일한 조건에서 실행하지 않는 inheritance:extends 사용자 정의이며,
관련 문제