2016-03-18 2 views
0

У меня есть большое количество объектов, сгенерированных через 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 ?

ответ

0

Но у меня есть большое количество и определение каждой аннотации вручную - это не только утомительно, но и плохо с точки зрения изменения и расширения.

Для меня @com.example.RelationType(type = "SomeRelationType") выглядит как тривиальная метаинформация, которая может быть получена путем отражения без каких-либо аннотаций. Поэтому проверьте, есть ли способ сделать «соглашение над конфигурацией».

jaxb2-annotate-plugin не поддерживает и не поддерживает параметризацию, он будет слишком узким и слишком сложным для реализации. Отказ от ответственности Я являюсь автором jaxb2-annotate-plugin.

Я вижу два варианта:

  • прегенерация привязок в сборки. XML-схема - это XML, поэтому запись XSLT для создания файлов привязок не должна быть слишком сложной.
  • Создайте собственный плагин XJC, чтобы добавлять аннотации по своему желанию.
  • Подберите меня, чтобы добавить параметризацию в jaxb2-annotate-plugin.

Право, всего два варианта.

Смежные вопросы