XML& JAXB:将属性传递给值

时间:2016-03-18 10:43:07

标签: java xml xpath jaxb maven-jaxb2-plugin

我有大量通过JAXB(maven-jaxb2-plugin)生成的对象,并用jaxb2-annotate-plugin注释它们。这些类可以定义RelationType,并且我希望使用相应的@RelationType注释来注释它们。我使用XPath表达式在XSD中查找name属性并注释该类,并将其特定类型传递给注释。这方面的一个例子如下:

<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中这是不可能的?

1 个答案:

答案 0 :(得分:0)

  

但是我有大量的手动定义每个注释不仅乏味,而且在变化和扩展方面也很糟糕。

对我来说,@com.example.RelationType(type = "SomeRelationType")看起来像一个微不足道的元信息,可以通过反射得到而无需任何注释。因此,检查是否有一种方法可以做到&#34;约定优于配置&#34;的事情。

jaxb2-annotate-plugin不支持参数化,也不支持参数化,实现起来太狭隘,太复杂。 免责声明我是jaxb2-annotate-plugin的作者。

我看到两个选项:

  • 在您的构建中预生成绑定。 XML Schema是XML,因此编写XSLT来生成绑定文件不应该太复杂。
  • 编写自己的XJC插件,根据需要添加注释。
  • 贿赂我将参数化添加到jaxb2-annotate-plugin

是的,只有两个选项。