我有大量通過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是這不可能?