wsimport не генерирует сеттеры для коллекций - PullRequest
4 голосов
/ 22 апреля 2011

Я использую следующую задачу Ant для генерации клиентского кода для конечной точки веб-службы:

    <wsimport wsdl="target/classes/META-INF/wsdl/MyService.wsdl"
              sourcedestdir="target/wsimport"
              verbose="true"
              xnocompile="false"
              xendorsed="true"
              destdir="target/classes"
              keep="true"
              package="com.example.client.jaxws"
              wsdlLocation="/META-INF/wsdl/MyService.wsdl" />

Это создает классы, которые клиенты используют для передачи данных в веб-службу, например,

class Foo {

  String name;
  List<String> bars;

  public void setName(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public List<String> getBars() {
    return bars;
  }
}

Обратите внимание, что для свойства bars сгенерированный класс не содержит установщика, поэтому клиент должен будет получить к нему доступ через:

someFoo.getBars().add("val");

Однако отсутствие установщика означает, что этот классне будет работать с различными инструментами, основанными на соглашении JavaBeans (например, Dozer), поэтому я хотел бы заставить wsimport генерировать сеттеры.Я нашел поток , который указывает, что вы можете принудительно генерировать сеттер, добавив следующее к задаче Ant

<xjcarg value="-Xcollection-setter-injector"/>

Однако этот поток довольно старый, и приведенное выше, похоже, неработать больше.

Ответы [ 2 ]

2 голосов
/ 26 ноября 2015

Вам необходимо включить библиотеку расширений jaxb xjc в ваш путь к классу сборки и использовать -Xsetters xjcArg.Это заставит ваши сгенерированные заглушки иметь сеттеры для ваших List объектов.

Для пользователей Maven с jaxws-maven-plugin это выглядит так:

      <!-- generates webservice client stubs using wsimport -->
        <plugin>
            <groupId>org.jvnet.jax-ws-commons</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>${jaxws-maven-plugin.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                    <configuration>
                        <wsdlDirectory>${basedir}/src/main/resources/${resources-folder}/wsdl/v1</wsdlDirectory>
                        <wsdlFile>${wsdlFileName}</wsdlFile>
                        <bindingFiles>
                            <bindingFile>${basedir}/src/main/resources/jaxb-bindings.xml</bindingFile>
                        </bindingFiles>
                        <vmArgs>
                            <vmArg>-Djavax.xml.accessExternalSchema=all</vmArg> <!-- necessary for JDK 8 -->
                        </vmArgs>
                        <xjcArgs>
                            <xjcArg>-Xsetters</xjcArg>
                        </xjcArgs>
                    </configuration>
                </execution>
            </executions>
            <dependencies>
                <!-- put xjc-plugins on the jaxws-maven-plugin's classpath -->
                <dependency>
                    <groupId>org.jvnet.jaxb2_commons</groupId>
                    <artifactId>jaxb2-basics</artifactId>
                    <version>0.9.5</version>
                </dependency>
            </dependencies>
        </plugin>  

А для пользователей Maven с cxf-codegen-plugin это выглядит так:

        <!-- generates webservice client stubs using CXF framework-->
        <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>${cxf.version}</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
                        <wsdlOptions>
                            <wsdlOption>
                                <wsdl>${adapter.api.wsdlFileName}</wsdl>
                                <bindingFiles>
                                    <bindingFile>${basedir}/src/main/resources/jaxb-bindings.xml</bindingFile>
                                </bindingFiles>
                                <extraargs>
                                    <extraarg>-xjc-Xsetters</extraarg><!-- needed so that setters for lists are generated -->
                                </extraargs>
                            </wsdlOption>
                        </wsdlOptions>
                    </configuration>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <!-- plugin needed to customize cxf genrated classes -->
                <dependency>
                    <groupId>org.jvnet.jaxb2_commons</groupId>
                    <artifactId>jaxb2-basics</artifactId>
                    <version>0.9.4</version>
                </dependency>
            </dependencies>
        </plugin>
1 голос
/ 22 апреля 2011

эта функциональность обеспечивается плагином, плагином "jaxb2 commons collection set inctor". Вы включили эту банку в свой путь к классу xjc?

...