У меня есть большое количество объектов, сгенерированных через JAXB (maven-jaxb2-plugin
), и аннотируйте их с помощью jaxb2-annotate-plugin
. Эти классы могут определять RelationType
, и я хотел бы аннотировать их с помощью соответствующей аннотации @RelationType
. Я использую выражение XPath, чтобы найти атрибут name в XSD и аннотировать класс, передавая его конкретный тип в аннотацию. Примером этого является следующее: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>
Я нахожу ComplexType с именем SomeRelationType
и аннотировать класс с @RelationType
аннотацию, которая имеет SomeRelationType
в качестве параметра своего типа. Он будет генерировать следующий класс:
@RelationType(type = "SomeRelationType")
public class SomeRelationType extends RelationType implements Serializable {
private final static long serialVersionUID = 1L;
protected SomeValue someValue;
protected OtherValue otherValue;
}
Это прекрасно работает, если это всего лишь несколько объектов домена. Но у меня большое количество и определение каждой аннотации вручную - это не только утомительно, но и плохо с точки зрения изменения и расширения.
Чтобы generify, я могу переписать выражение 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"
. Было бы здорово, если бы я мог использовать тот же @name
, как определено в выражении XPath. Затем все классы, имя которых заканчивается "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 ?