0

編集:私の意図をより明確にするために、質問を再フォーマットしました。

JAXB マーシャラーを使用して Java オブジェクトを XML にマップし、ベンダー SOAP サービスの SOAP 要求を作成しようとしています。空またはnullであっても、リクエストに提示する必要がある要素はほとんどありません。pom.xml でjaxws-maven-pluginプラグインを使用して、WSDL ファイルからソースを生成します。wsimport

<plugin>
<groupId>com.helger.maven</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.6</version>
<executions>
    <execution>
        <goals>
            <goal>wsimport</goal>
        </goals>
        <configuration>
            <wsdlFiles>
                <wsdlFile>${project.basedir}/src/wsdl/sample/SomeSoapService.wsdl</wsdlFile>
            </wsdlFiles>
        </configuration>
        <id>wsimport-generate-cbs</id>
        <phase>generate-sources</phase>
    </execution>
</executions>
<dependencies>
    <dependency>
        <groupId>javax.xml</groupId>
        <artifactId>webservices-api</artifactId>
        <version>2.0</version>
    </dependency>
</dependencies>
<configuration>
    <sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
    <xnocompile>true</xnocompile>
    <xadditionalHeaders>true</xadditionalHeaders>
    <verbose>true</verbose>
    <extension>true</extension>
</configuration>

私はここ[ https://stackoverflow.com/questions/11215485/jax-ws-to-remove-empty-tags-from-request-xml ]から読んで理解しましたxs:stringタイプの要素の場合、空のタグは空""の文字列を値として設定することで生成されます。ただし、それぞれオブジェクトxs:dateTime, xs:boolean, xs:integerを生成するなどのタイプの要素では実行できません。XMLGregorianCalendar, BigInteger, Boolean値を null に設定すると、マーシャリング プロセスで要素が生成されません。他の人が指摘したように、に追加することで実現できますがnillable=true@XmlElement最初のビルド後にmavenからプラグインを削除しない限り、次のビルドで上書きされる生成されたソースに変更する必要があります。

私の現在の回避策は、リクエストで提示する必要がある特定の要素のタイプをxs:stringWSDL ファイルに変更し、対応する Java オブジェクト フィールドに空の文字列を渡すことです。

nillable=true私の質問は、生成されたフィールドに追加するために jaxws:wsimport をトリガーする WSDL 側で変更を加えることは可能@XmlElementですか? 生成されたソースではなく WSDL ファイルを変更することを好む理由は、

  1. すべての変更を 1 か所にまとめて簡単に文書化できるように、すでに WSDL ファイルにいくつかの変更を加えています。
  2. 生成されたソースを変更しないようにして、Git リポジトリから除外し、ビルドごとに上書きされないようにしたいと考えています。

以下は、コードの簡略化されたバージョンです。

まず、complexType Currency 用に生成された Java クラスを用意します。

// Generated    
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "currency", propOrder = {
    "crossCurrency",
    "amount"
})
public class Currency {

    @XmlElement(required = true)
    protected Boolean crossCurrency;
    @XmlElement(required = true)
    protected BigDecimal amount;
}

フィールドが存在しないため、フィールドをnullに設定しました。

requestInputRq.setCurrency(new Currency());
requestInputRa.setOtherField("Some value");

<typ:Currency /> が生成されますが、以下のように生成する必要があります。

<typ:Currency>
    <typ:crossCurrency/>
    <typ:amount/>
</typ:Currency>
4

1 に答える 1