SOAP未能序列化xsd:int和soapenc:string? 我刚刚被分配来帮助维护一个大型的java项目,它通过SOAP与我公司的C++ C++基础通信,并且不知道我在做什么。(Java、netbeans、网络、SOAP……对我来说都是新事物。) 存在一个工作正常的PromptPlayable类,我正在尝试添加一个可选的“Parameters”类,该类包含三个数组(一个int,两个string)。这里总结了代码。 在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; } }

SOAP未能序列化xsd:int和soapenc:string? 我刚刚被分配来帮助维护一个大型的java项目,它通过SOAP与我公司的C++ C++基础通信,并且不知道我在做什么。(Java、netbeans、网络、SOAP……对我来说都是新事物。) 存在一个工作正常的PromptPlayable类,我正在尝试添加一个可选的“Parameters”类,该类包含三个数组(一个int,两个string)。这里总结了代码。 在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; } },java,apache,serialization,soap,wsdl,Java,Apache,Serialization,Soap,Wsdl,PromptPlayableCallParams.java: public class PromptPlayableCallParams { private int[] intParams; private java.lang.String[] stringParams; private java.lang.String[] fileParams; public int[] getIntParams() { return intParams;

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>
当新参数未使用(
null
)时,一切正常。但是,当使用参数(不是<代码> null <代码> >时,调用< Acache .Apache .Axache .Client…调用……调用(…)<代码>永远不会返回(我不能进入它),C++侧冻结了对SOAP消息的永久监听,而我知道这一点的同事说,问题在数组的java序列化中。


我的问题是:这里有人能看到我的SOAP/Java有什么问题吗(值得怀疑),或者有人对我如何发现有什么想法吗(也值得怀疑)?

从来没有发现过这个问题。我们将
java.lang.String[]
替换为
Vector()
,一切都神奇地工作了。想想看。你能把它作为一个答案并接受它吗?@FracturedRetina:但这并不是问题的答案
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 {