編集:私の意図をより明確にするために、質問を再フォーマットしました。
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:string
WSDL ファイルに変更し、対応する Java オブジェクト フィールドに空の文字列を渡すことです。
nillable=true
私の質問は、生成されたフィールドに追加するために jaxws:wsimport をトリガーする WSDL 側で変更を加えることは可能@XmlElement
ですか? 生成されたソースではなく WSDL ファイルを変更することを好む理由は、
- すべての変更を 1 か所にまとめて簡単に文書化できるように、すでに WSDL ファイルにいくつかの変更を加えています。
- 生成されたソースを変更しないようにして、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>