リモートの .Net SOAP Web サービスと通信する Java Web サービス クライアントがあります。対応する JAXB Java オブジェクトをパックおよびアンパックする代わりに、生の XML を引数の 1 つに置き換える必要があります。
問題:
生の XML を挿入するために「javax.xml.bind.Unmarshaller」を使用することにしました。(別のより良い方法があるかどうかはわかりません)。
JAXB を使用した場合に呼び出しが機能することを確認し、SOAP 要求メッセージを記録しました (以下を参照)。
WS error: Unexpected element "requestOptions". Expected elements are "".
XML を直接追加しようとすると表示されます。
WORKING Java CLIENT (有効な "RequestOptions" JAXB オブジェクトを返します):
private RequestOptions mkRequestOptions () throws Exception {
RequestOptions requestOptions = new com.mypackage.shwsclients.ObjectFactory().createRequestOptions ();
requestOptions.setTransactionId("007");
requestOptions.setUserName("testName");
requestOptions.setWorkflowName("testWorkflow");
requestOptions.setModuleName("testModule");
return requestOptions;
}
FAILING JAVA CLIENT (XML 文字列のアンマーシャリングに失敗):
private static String theXml =
"<requestOptions>\n" +
" <WorkflowName>unmarshalTestWorkflow</WorkflowName>\n" +
" <ModuleName>unmarshalTestModule</ModuleName>\n" +
" <UserName>unmarshalTestName</UserName>\n" +
" <TransactionId>0099</TransactionId>\n" +
"</requestOptions>\n";
private RequestOptions mkRequestOptions () throws Exception {
JAXBContext context = JAXBContext.newInstance(RequestOptions.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Object obj = unmarshaller.unmarshal(new StringReader (theXml)); // DIES HERE!!!!
RequestOptions requestOptions = (RequestOptions)obj;
return requestOptions;
}
成功した SOAP 要求:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<GetAddressData xmlns="http://myservice.com/wsdl/myservice">
<requestOptions>
<WorkflowName>testWorkflow</WorkflowName>
<ModuleName>testModule</ModuleName>
<UserName>testName</UserName>
<TransactionId>007</TransactionId>
</requestOptions>
<zipCode>90210</zipCode>
</GetAddressData>
</soapenv:Body>
</soapenv:Envelope>
自動生成されたプロキシ コード:
//
// Generated By:JAX-WS RI 2.2.4-b01 (JAXB RI IBM 2.2.4)
//
package com.mypackage;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
...
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "RequestOptions", propOrder = {
"workflowName",
"moduleName",
"userName",
"transactionId"
})
public class RequestOptions
implements Serializable
{
@XmlElement(name = "WorkflowName")
protected String workflowName;
@XmlElement(name = "ModuleName")
protected String moduleName;
@XmlElement(name = "UserName")
protected String userName;
@XmlElement(name = "TransactionId")
protected String transactionId;
...