В JAXB поколения хотя XJC код - добавление @XmlRootElement и Джода Датавремя


Вот интересный сценарий, с которым я столкнулась на днях. Я в конечном итоге найти решение самостоятельно. Однако, я бы приветствовать любые замечания и лучшие подходы.

Требования

Я хочу, чтобы генерировать объекты JAXB, основанный на сборе файлы xsd с помощью хотя XJC как часть компоновки Maven. Я буду с помощью JAXB-РИ 2.1 По мере реализации.

Кроме того, я хочу убедиться, что все объекты реализуют фирменный интерфейс (например, MySignature), который не имеет никаких методов. Кроме того, я хочу, чтобы избежать использования XmlGregorianCalendar и Джода DataTime вместо (с помощью подходящего адаптера, которые я назвал DateUtils с разбора() и формат() методы).

Наконец, я хочу быть в состоянии выбрать определенные объекты в качестве корневых элементов, так что мне нужно, чтобы выборочно добавить @XmlRootElement на некоторые объекты, и у меня есть подходящие выражения XPath, чтобы найти их.

Я не могу вносить любые изменения в файлы xsd.

Подход

Шаг 1 - Настройка pom.xml

Настроить Maven для использования плагина хотя XJC следующим образом:

<build>
    <plugins>
      <plugin>
        <groupId>org.jvnet.jaxb2.maven2</groupId>
        <artifactId>maven-jaxb2-plugin</artifactId>
        <version>0.7.4</version>
        <executions>
          <execution>
            <id>generate-domain1</id>
            <goals>
              <goal>generate</goal>
            </goals>
            <configuration>
              <strict>false</strict>
              <schemaIncludes>
                <value>domain1.xsd</value>
              </schemaIncludes>
              <bindingIncludes>
                <include>domain1-bindings.xjb</include>
              </bindingIncludes>
              <extension>true</extension>
              <generatePackage>org.example.domain1</generatePackage>
              <generateDirectory>${project.build.directory}/generated-sources/domain1</generateDirectory>
              <args>
                <arg>-Xannotate</arg>
               </args>                  
               <plugins>
                <plugin>
                  <groupId>org.jvnet.jaxb2_commons</groupId>
                  <artifactId>jaxb2-basics</artifactId>
                  <version>0.6.0</version>
                </plugin>
                <plugin>
                  <groupId>org.jvnet.jaxb2_commons</groupId>
                  <artifactId>jaxb2-basics-annotate</artifactId>
                  <version>0.6.0</version>
                </plugin>
              </plugins>
            </configuration>
          </execution>
        </executions>
      </plugin>
   </plugins>
</build>

Использование специальной конфигурации исполнения, чтобы был дополнительный взаимоисключающие файлы xsd с помощью различных целевых выходной путь.

Шаг 2 - Настройка Привязок

Следующее src/главная/ресурсы/домен1-Привязок.xjb.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:annox="http://annox.dev.java.net"
  xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
  jaxb:extensionBindingPrefixes="xjc annox"
  version="2.1">

  <jaxb:globalBindings>
    <jaxb:serializable uid="1"/>
    <!-- All generated classes must have MySignature interface (supplied in dependencies) -->
    <xjc:superInterface name="org.example.MySignature"/>
    <!-- All temporal fields are implemented as Joda DateTime and use DateUtils as an adapter -->
    <jaxb:javaType
      name="org.joda.time.DateTime"
      xmlType="xs:time"
      parseMethod="org.example.DateUtils.parseDateTime"
      printMethod="org.exmaple.DateUtils.formatDateTime"
      />
  </jaxb:globalBindings>

  <!-- Application of annotations to selected classes within schemas -->

  <!-- org.example.SomeRootType @XmlRootElement -->
  <jaxb:bindings schemaLocation="domain1.xsd" node="/xs:schema">
    <jaxb:bindings node="xs:complexType[@name='SomeRootType']">
      <annox:annotate>
        <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="SomeRootType"/>
      </annox:annotate>
    </jaxb:bindings>
  </jaxb:bindings>

</jaxb:bindings>

Устранение неполадок

Если вы столкнулись позорный

Поддерживается привязка пространств имен "". Возможно, вы имели в виду "http://annox.dev.java.net"

затем вы должны рассмотреть ваши привязки.xjb , чтобы убедиться, что вы используете правильный URI пространства имен (как определено выше) и включили их в extensionBindingPrefixes.



55249
24
задан 14 апреля 2011 в 09:04 Источник Поделиться
Комментарии
1 ответ

В тег создает новый орг.В3._2001.как xmlschema.AdapterN класс для каждого нового javaType определение. Поэтому лучшим подходом будет:


  • Создать класс, расширяющий XmlAdapter. В ней вам придется переопределить определенные методы. Так, например, класс может быть орг.пример.DateUtilsAdapter.

  • Вместо того, чтобы использовать этот тег:

    <xjc:javaType
    name="org.joda.time.DateTime"
    xmlType="xs:time"
    adapter="org.example.DateUtilsAdapter" />

Источник

5
ответ дан 22 августа 2012 в 09:08 Источник Поделиться