Изменение стратегии именования Hyperjaxb3 между 0.5.6 и 0.6.2

У нас есть значительная кодовая база, которая использует Hyperjaxb3 для аннотирования классов Java, которые генерируются с использованием xjc (наряду с другими плагинами xjc, в том числе и самодельными).

Мы пытаемся перейти с версии Hyperjaxb3 0.5.6 на 0.6.2, но столкнулись с серьезной проблемой, связанной с очевидным изменением стратегии именования между этими версиями.

В частности, когда имя complexType, такое как "OneTwo", приводит к имени таблицы "ONETWO" в 0.5.6, тогда как в 0.6.2 имя таблицы - "ONE_TWO". То же самое для имен столбцов.

Мы очень сильно предпочитаем НЕ рефакторировать сотни запросов, чтобы учесть такое изменение имен (хотя более новое, более традиционное именование SQL, безусловно, имеет смысл - мы хотели бы, чтобы это было поведение по умолчанию, когда этот проект начался шесть лет назад).

Есть ли простой способ перейти на старую стратегию именования? В противном случае, можете ли вы предоставить подробную информацию о том, как именно расширить Hyperjaxb3 с помощью собственной стратегии именования?

Посмотрев на этот или этот тест, нам не совсем ясно, что нам нужно сделать с нашим pom, чтобы указать другой класс стратегии именования, и Руководство по расширению в настоящее время пусто.

  <plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <configuration>
      <extension>true</extension>
      <plugins>
        <plugin>
          <groupId>org.jvnet.jaxb2_commons</groupId>
          <artifactId>jaxb2-basics</artifactId>
          <version>${jaxb.commons.version}</version>
        </plugin>
        <plugin>
          <groupId>org.jvnet.hyperjaxb3</groupId>
          <artifactId>hyperjaxb3-ejb-plugin</artifactId>
          <version>${hyperjaxb3.version}</version>
        </plugin>
        <plugin>
          <groupId>${project.groupId}</groupId>
          <artifactId>jaxb-x12</artifactId>
          <version>${project.version}</version>
        </plugin>
      </plugins>
      <args>
        <arg>-enableIntrospection</arg>
        <arg>-Xcopyable</arg>
        <arg>-Xequals</arg>
        <arg>-XhashCode</arg>
        <arg>-Xinheritance</arg>
        <arg>-Xhyperjaxb3-ejb</arg>
        <arg>-Xx12</arg>
      </args>
    </configuration>
  </plugin>

1 ответ

Решение

Автор HJ3 здесь.

Взгляните на тестовый проект с пользовательскими именами. Он реализует и настраивает собственную стратегию именования.

Решение состоит из двух частей: реализация стратегии именования и настройка этой реализации.

Реализация именования должна реализовывать org.jvnet.hyperjaxb3.ejb.strategy.naming.Naming интерфейс. Проще всего было бы унаследовать от org.jvnet.hyperjaxb3.ejb.strategy.naming.impl.DefaultNaming,

Для настройки нужно создать ресурс /org/jvnet/hyperjaxb3/ejb/plugin/custom/applicationContext.xml которая в основном является конфигурацией Spring XML. Там определите бин с именем naming:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <bean name="naming" class="com.acme.foo.MyNaming">
        <property name="reservedNames" ref="reservedNames"/>
    </bean>

</beans>

Это заменит стандартную стратегию именования.

Другие вопросы по тегам