Аннотируемый 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>
Надеюсь это поможет!