XML & JAXB:将属性传递给值
XML & JAXB: pass attribute into value
我有大量通过 JAXB (maven-jaxb2-plugin
) 生成的对象,并用 jaxb2-annotate-plugin
注释它们。这些 classes 可能定义了一个 RelationType
,我想用相应的 @RelationType
注释来注释它们。我使用 XPath 表达式在 XSD 中查找名称属性并注释 class,将其特定类型传递到注释中。下面是一个例子:
<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
注释对 class 进行注释,其中 SomeRelationType
作为其类型参数。它将生成以下 class:
@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"
结尾的 classes 也会自动获得带有正确 type
参数的 @RelationType
注释。
它当然不像执行以下操作那么简单,但它显示了我想要实现的目标:
<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 中这样的事情是可能的还是不可能的?
But I have a large amount and defining every annotation manually is not only tedious but also bad in terms of change and expansion.
对我来说,@com.example.RelationType(type = "SomeRelationType")
看起来像是一个微不足道的元信息,可以通过反射导出而无需任何注释。所以检查是否有办法做 "convention over configuration" 事情。
jaxb2-annotate-plugin
不支持也不会支持参数化,实现起来会过于狭窄和复杂。 免责声明我是jaxb2-annotate-plugin的作者。
我看到两个选项:
- 在您的构建中预先生成绑定。 XML 架构是 XML 所以编写 XSLT 来生成绑定文件应该不会太复杂。
- 编写自己的 XJC 插件以根据需要添加注释。
- 贿赂我给 jaxb2-annotate-plugin 添加参数化。
对,就两个选择。
我有大量通过 JAXB (maven-jaxb2-plugin
) 生成的对象,并用 jaxb2-annotate-plugin
注释它们。这些 classes 可能定义了一个 RelationType
,我想用相应的 @RelationType
注释来注释它们。我使用 XPath 表达式在 XSD 中查找名称属性并注释 class,将其特定类型传递到注释中。下面是一个例子:
<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
注释对 class 进行注释,其中 SomeRelationType
作为其类型参数。它将生成以下 class:
@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"
结尾的 classes 也会自动获得带有正确 type
参数的 @RelationType
注释。
它当然不像执行以下操作那么简单,但它显示了我想要实现的目标:
<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 中这样的事情是可能的还是不可能的?
But I have a large amount and defining every annotation manually is not only tedious but also bad in terms of change and expansion.
对我来说,@com.example.RelationType(type = "SomeRelationType")
看起来像是一个微不足道的元信息,可以通过反射导出而无需任何注释。所以检查是否有办法做 "convention over configuration" 事情。
jaxb2-annotate-plugin
不支持也不会支持参数化,实现起来会过于狭窄和复杂。 免责声明我是jaxb2-annotate-plugin的作者。
我看到两个选项:
- 在您的构建中预先生成绑定。 XML 架构是 XML 所以编写 XSLT 来生成绑定文件应该不会太复杂。
- 编写自己的 XJC 插件以根据需要添加注释。
- 贿赂我给 jaxb2-annotate-plugin 添加参数化。
对,就两个选择。