SOAP не удалось сериализовать xsd: int и soapenc: string? - PullRequest
1 голос
/ 13 сентября 2011

Я только что был назначен, чтобы помочь поддерживать крупный Java-проект, который связывается с основной базой кода C ++ моей компании через SOAP, и понятия не имею, что я делаю. (Java, NetBeans, сеть, SOAP ... все новое для меня.)
Существует класс PromptPlayable, который работал нормально, и я пытаюсь добавить необязательный класс «Параметры», который содержит три массива (один из целых чисел, две из строк.) Код здесь обобщен.
В PromptPlayable.java:

public class PromptPlayable {
    // older working parameters stripped
    private PromptPlayableCallParams parameters = null;

    public PromptPlayableCallParams getParameters() {
        return parameters;
    }
    public void setParameters(PromptPlayableCallParams parameters) {
        this.parameters = parameters;
    }
}

PromptPlayableCallParams.java:

public class PromptPlayableCallParams {
    private int[] intParams;
    private java.lang.String[] stringParams;
    private java.lang.String[] fileParams;

    public int[] getIntParams() {
        return intParams;
    }
    public void setIntParams(int[] intParams) {
        this.intParams = intParams;
    }
    public java.lang.String[] getStringParams() {
        return stringParams;
    }
    public void setStringParams(java.lang.String[] stringParams) {
        this.stringParams = stringParams;
    }
    public java.lang.String[] getFileParams() {
        return fileParams;
    }
    public void setFileParams(java.lang.String[] fileParams) {
        this.fileParams = fileParams;
    }
}

И WSDL:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="urn:channel" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="urn:channel" xmlns:intf="urn:channel" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <wsdl:types>
  <schema targetNamespace="urn:channel" xmlns="http://www.w3.org/2001/XMLSchema">
    <complexType name="ArrayOfString">
      <complexContent>
        <restriction base="soapenc:Array">
          <attribute ref="soapenc:arrayType" wsdl:arrayType="soapenc:string[]"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="ArrayOfInt">
      <complexContent>
        <restriction base="soapenc:Array">
          <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:int[]"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="PromptPlayableCallParams">
      <sequence>
        <element name="intParams" type="impl:ArrayOfInt"/>
        <element name="stringParams" type="impl:ArrayOfString"/>
        <element name="fileParams" type="impl:ArrayOfString"/>
      </sequence>
    </complexType>
    <complexType name="PromptPlayable">
    <sequence>
      <!-- older working parameters stripped -->
      <element name="parameters" nillable="true" type="impl:PromptPlayableCallParams"/>
    </sequence>
   </complexType>
 </wsdl:types>
 <!-- wsdl::messages and other stuff I don't understand yet -->
</wsdl:definitions>

В каком-то реальном коде Java где-то:

public void doPromptAndCollect(com.company.reuse.context.PromptAndCollectParameters in0)    
    org.apache.axis.client.Call _call = createCall();
        _call.setOperation(_operations[18]);
        _call.setUseSOAPAction(true);
        _call.setSOAPActionURI("");
        _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
        _call.setOperationName(new javax.xml.namespace.QName("urn:channel", "doPromptAndCollect"));


        setRequestHeaders(_call);
        setAttachments(_call);
 try { 
        java.lang.Object _resp = _call.invoke(new java.lang.Object[] {in0});
        if (_resp instanceof java.rmi.RemoteException) {
            throw (java.rmi.RemoteException)_resp;
        }
        extractAttachments(_call);
  } catch (org.apache.axis.AxisFault axisFaultException) {
  //more code
throws java.rmi.RemoteException, com.company.reuse.context.ChannelException {

Когда новые параметры не используются (null), все работает как всегда. Однако, когда используются параметры (не null), вызов org.apache.axis.client.Call.invoke(...) никогда не возвращается (кажется, я не могу в это вступить), сторона C ++ постоянно замирает, прослушивая сообщение SOAP, и мой сотрудник кто знает это, говорит, что проблема заключается в сериализации Java массивов.

У меня такой вопрос: может ли кто-нибудь увидеть, что не так с моим SOAP / Java здесь (сомнительно), или у кого-нибудь есть идеи относительно того, как я могу выяснить (также сомнительно)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...