2016-03-18 70 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

对,只有两个选项。