2016-03-18 114 views
0

我有大量通過JAXB(maven-jaxb2-plugin)生成的對象並使用jaxb2-annotate-plugin註釋它們。這些類可能會定義一個RelationType,我想用相應的@RelationType註釋對它們進行註釋。我使用XPath表達式在XSD中查找name屬性並註釋該類,並將其特定類型傳遞給註釋。這方面的一個例子是:XML&JAXB:將屬性傳遞到值

<jaxb:bindings node="//xsd:complexType[@name='SomeRelationType']"> 
    <annox:annotate target="class">@com.example.RelationType(type = "SomeRelationType")</annox:annotate> 
</jaxb:bindings> 

它映射以下XSD片段:

<xsd:complexType name="SomeRelationType"> 
    <xsd:complexContent> 
     <xsd:extension base="RelationType"> 
      <xsd:sequence> 
       <xsd:element name="someValue" type="SomeValue"/> 
       <xsd:element name="otherValue" type="OtherValue"/>      
      </xsd:sequence> 
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

我找到了SomeRelationType名的ComplexType並用@RelationType註釋,裏面有註釋類作爲其類型參數的是SomeRelationType。它會生成以下類別:

@RelationType(type = "SomeRelationType") 
public class SomeRelationType extends RelationType implements Serializable { 
    private final static long serialVersionUID = 1L; 
    protected SomeValue someValue; 
    protected OtherValue otherValue;  
} 

如果它只是幾個域對象,這可以正常工作。但是我有很大的數量,並且手動定義每個註釋不僅繁瑣而且在變化和擴展方面也不好。

泛型化它,我可以重寫XPath表達式如下:

<jaxb:bindings node="//xsd:complexType[substring(@name, string-length(@name) - string-length('RelationType') + 1)]" multiple="true"> 
    <annox:annotate target="class">@com.example.RelationType(type = "SomeRelationType")</annox:annotate> 
</jaxb:bindings> 

問題:我的註釋的類型參數仍然定義爲"SomeRelationType"。如果我可以使用與XPath表達式中定義的相同的@name,那將是非常好的。然後,名稱以"RelationType"結尾的所有課程也會自動獲取@RelationType註釋,其中包含正確的type參數。

它不工作,因爲這樣做,當然下面一樣簡單,但它表明想什麼,我來實現:

<jaxb:bindings node="//xsd:complexType[substring(@name, string-length(@name) - string-length('RelationType') + 1)]" multiple="true"> 
    <annox:annotate target="class">@com.example.RelationType(type = @name)</annox:annotate> 
</jaxb:bindings> 

這種事甚至有可能或XML/JAXB是這不可能?

回答

0

但是我有一個很大的數量和手動定義每個註釋不僅繁瑣,而且在變化和擴展方面也不好。

對於我來說,@com.example.RelationType(type = "SomeRelationType")看起來像一個簡單的元信息,它可以通過反射派生而無需任何註釋。所以檢查是否有辦法做「約定配置」的事情。

jaxb2-annotate-plugin不支持參數化,它太窄又太複雜,無法實現。 免責聲明我是jaxb2-annotate-plugin的作者。

我看到兩個選項:

  • 在構建預生成綁定。 XML Schema是XML,所以編寫XSLT來生成綁定文件不應該太複雜。
  • 編寫一個自己的XJC插件,根據需要添加註釋。
  • 賄賂我將參數化添加到jaxb2-annotate-plugin

對,只有兩個選項。