0

リモートの .Net SOAP Web サービスと通信する Java Web サービス クライアントがあります。対応する JAXB Java オブジェクトをパックおよびアンパックする代わりに、生の XML を引数の 1 つに置き換える必要があります。

問題:

  1. 生の XML を挿入するために「javax.xml.bind.Unmarshaller」を使用することにしました。(別のより良い方法があるかどうかはわかりません)。

  2. JAXB を使用した場合に呼び出しが機能することを確認し、SOAP 要求メッセージを記録しました (以下を参照)。

  3. 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;
    ...
4

1 に答える 1

0

問題が解決しました。

解決策は、すべての引数を XML に入れ、メッセージ全体を非整列化することでした。

単一の引数を非整列化できると思いました。代わりに、メッセージ全体を非整列化する必要がありました。クラス JAXB は「@XmlRootElement」と注釈を付けました。

于 2013-02-05T08:09:16.503 に答える