Я только что был назначен, чтобы помочь поддерживать крупный 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 здесь (сомнительно), или у кого-нибудь есть идеи относительно того, как я могу выяснить (также сомнительно)?