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

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

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

В частности, когда имя сложного типа, такое как «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>

person Rob    schedule 11.01.2018    source источник


Ответы (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. Там определите bean-компонент с именем 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>

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

person lexicore    schedule 13.01.2018
comment
У меня точно такая же проблема. Пытался воспроизвести структуру тестового проекта с пользовательскими именами и все такое, но похоже, что сгенерированные объекты не затронуты. Есть ли способ убедиться, что пользовательский класс именования действительно вызывается? - person Arch; 07.11.2019
comment
@Arch Сгенерируйте исключение и посмотрите, действительно ли оно сгенерировано. - person lexicore; 09.11.2019
comment
Привет @lexicore, я действительно сделал это, но не повезло. Объединив ваши ответы на разные вопросы здесь, на SO, я дошел до того, что создал крошечный проект (на основе примеров github), содержащий класс, который переопределяет стратегию именования и компонент spring xml в ресурсах. Я проверил, что xml включен в созданный jar-файл, и использовал этот jar-файл в качестве зависимости в проекте, где я пытаюсь создать объекты из XSD с помощью плагина maven. К сожалению, ничего не происходит. - person Arch; 11.11.2019
comment
@Arch Пришлите мне PR с примером проекта где-нибудь по адресу github.com/highsource/hyperjaxb3-support. посмотрю в чем может быть проблема. - person lexicore; 11.11.2019