Аннотируемый CXF (wsdl2java) сгенерированный пакет

Мне нужно добавить аннотацию уровня пакета (адаптер типа XmlJavaTypeAdapters). Проблема в том, что когда я запускаю wsdl2java, он генерирует файл package-info.java для этого пакета.

Когда я пытаюсь добавить свой собственный package-info.java, я получаю ошибку: "тип package-ingo уже определен".

Есть ли способ добавить мою аннотацию в package-info.java?? Может быть, есть другие идеи?

Спасибо

4 ответа

Решение

После некоторых исследований я использовал внешний картографический файл. Для всех, у которых есть проблемы, подобные моей, я описал ниже то, что нашел.

Если вы используете "cxf-codegen-plugin" для генерации исходного кода из WSDL, вы не можете использовать решение с package-info.java. Это потому, что сгенерированный код, вероятно, уже будет содержать этот файл. Вы также не можете добавить аннотацию к вашему классу, потому что она генерируется. Единственное решение - предоставить свой собственный картограф.

Прежде всего, вы должны написать собственный картограф. После этого вы должны определить файл отображения xjb и, наконец, добавить дополнительную конфигурацию в ваш pom.xml. Вы можете прочитать о первых двух шагах здесь.

Чтобы добавить внешний файл отображения в cxf-codegen-plugin, вы должны добавить что-то вроде этого в узел конфигурации в определении плагина:

<defaultOptions>
    <bindingFiles>
        <bindingFile>${basedir}/src/main/resources/mapping.xjb</bindingFile>
    </bindingFiles>
    <noAddressBinding>true</noAddressBinding>
</defaultOptions>

Обратите внимание, что вы не должны передавать дополнительные параметры в xjc, как описано здесь, потому что он не будет работать.

Надеюсь, это поможет кому-нибудь:)

Я никогда не пробовал этого, но вы можете попробовать добавить флаг -xjc-npa в команду wsdl2java. Теоретически, это говорит XJC не генерировать package-info.java и вместо этого прикреплять все пространства имен и тому подобное ко всем другим элементам, где это необходимо.

Вы можете предоставить "привязки" JAXB, либо встроенные в WSDL, либо в виде отдельного внешнего файла привязки, и JAXB сгенерирует соответствующие адаптеры и необходимые аннотации уровня пакета. Смотрите этот вопрос для примера.

Мне также нужно было добавить аннотацию к сгенерированному коду. Я использовал maven-replacer-plugin, чтобы сделать это сразу после создания классов Java. Вы можете использовать это решение для изменения любого файла, который выходит.

Вот соответствующий бит pom.xml:

    <plugin>
        <groupId>com.google.code.maven-replacer-plugin</groupId>
        <artifactId>replacer</artifactId>
        <version>${replacer.plugin.version}</version>
        <executions>
            <execution>
                <phase>process-sources</phase>
                <goals>
                    <goal>replace</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <filesToInclude>target/generated-sources/cxf/com/BLAH/client/api/v4/*.java</filesToInclude>
            <filesToExclude>target/generated-sources/cxf/com/BLAH/client/api/v4/ObjectFactory.java,
                target/generated-sources/cxf/com/BLAH/client/api/v4/package-info.java,
            </filesToExclude>
            <replacements>
                <replacement>
                    <!-- Add @XmlRootElement in front of public class Blah -->
                    <token>public class (\w*)</token>
                    <value>@XmlRootElement(name ="$1") ${line.separator}public class $1</value>
                </replacement>
                <replacement>
                    <!-- Add the import for the XmlRootElement annotation to the file -->
                    <token>import javax.xml.bind.annotation.XmlType;</token>
                    <value>import javax.xml.bind.annotation.XmlType;${line.separator}import javax.xml.bind.annotation.XmlRootElement;</value>
                </replacement>
            </replacements>
        </configuration>
    </plugin>

Надеюсь это поможет!

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