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; } }
PromptPlayableCallParams.java: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;
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 {