Сделайте сгенерированный cxf-codegen-plugin персистентный класс

У меня есть проект Maven jar, который создает клиент SOAP с помощью cxf-codegen-plugin.

В другом проекте Maven, использующем этот клиент, просто необходимо сохранить экземпляр класса данных (некоторый ответ мыла) - сгенерированный cxf-codegen-plugin - с JPA (в настоящее время используется OpenJPA) .

Это может быть возможно с некоторыми настройками, например, после каждой генерации исходного кода клиента добавлять аннотацию @Entity к классу данных перед компиляцией / расширением и установкой клиентского jar-файла, но я бы хотел избавиться от этой фазы, сохранив при этом клиент как можно более общий. Проекты, использующие client, должны просто иметь возможность безопасно предполагать, что класс поддерживает постоянство.

Лучшим способом справиться с этим могут быть некоторые уловки в настройках клиентского проекта (в настоящее время используется openjpa-maven-plugin для улучшения классов данных), чтобы обнаружить нужные классы и каким-то образом сделать их способными к сохранению, а также улучшить их.

Я бы предпочел пропустить такие вещи, как поддержка beans.xml, и по возможности придерживаться аннотаций, но это тоже вариант.


person pirho    schedule 16.06.2017    source источник


Ответы (1)


Если кому-то нужно то же самое, я опишу метод, который я использую в настоящее время. Он основан на добавлении аннотаций, полей типа id и imports с использованием com.google.code.maven-replacer-plugin.

Вскоре: я добавил следующее в свой pom.xml

<plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId>
    <version>1.5.3</version>
    <executions>
        <execution>
            <phase>process-sources</phase>
            <goals>
                <goal>replace</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <!-- dir where cxf-codegen-plugin has generated model classes -->
        <basedir>src/generated/java/org/example/service</basedir>
        <includes>
            <include>NamedEntity.java</include>
        </includes>
        <regex>false</regex>
        <replacements>
            <replacement>
                <token>package org.example.service.service;</token>
                <value>package org.example.service.service;

                    import javax.persistence.Id;
                    import javax.persistence.Entity;
                    import javax.persistence.Inheritance;
                    import javax.persistence.GeneratedValue;
                    import javax.persistence.InheritanceType;

                </value>
            </replacement>
            <replacement>
                <token>public class</token>
                <value>@Entity
                    @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
                    public class</value>
            </replacement>
            <replacement>
                <token>protected String name;
                </token>
                <value>protected String name;

                    @Id
                    @GeneratedValue
                    @Getter
                    private Long id;

                </value>
            </replacement>
        </replacements>
    </configuration>
</plugin>

Чтобы код был хорошо отформатирован, все отступы и переводы строк должны быть в <replacement>s. Используя регулярные выражения, это можно было бы сделать более стильно, но для меня этого достаточно.

person pirho    schedule 15.10.2017