Web services JAX-RPC客户端参数转换
我正在使用一个使用RPC编码的老式Web服务 我的问题似乎与XML类型有关 WSDL中的方法:Web services JAX-RPC客户端参数转换,web-services,client,jax-rpc,Web Services,Client,Jax Rpc,我正在使用一个使用RPC编码的老式Web服务 我的问题似乎与XML类型有关 WSDL中的方法: <message name="WsPublic_DHT_GetData1Request"> <part name="ALogin" type="xs:string" /> <part name="Aid" type="xs:int" /> <part name="ARow" type="xs:int" />
<message name="WsPublic_DHT_GetData1Request">
<part name="ALogin" type="xs:string" />
<part name="Aid" type="xs:int" />
<part name="ARow" type="xs:int" />
<part name="ADt" type="xs:dateTime" />
<part name="ADt2" type="xs:dateTime" />
<part name="Afilter" type="xs:string" />
</message>
a登录名+密码由“=”分隔。
我已经用vbs脚本测试了这个Web服务,它可以正常工作
问题是,在执行时,Web服务不断返回我:
lsVal=登录时出错
我使用的凭证很好,所以我打赌它在java字符串到xs:String之间的转换很糟糕。我试图手动定义调用的参数,但我只找到了XSD类型,它返回了相同的错误\u登录答案。
我想知道我是否错过了什么。有人能给我解释一下吗
下面是完整的.java文件
package com.verallia.testapp;
import javax.xml.namespace.QName;
import javax.xml.rpc.Call;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.encoding.XMLType;
public class JavaApplication1 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
// create the Service client object
// using the wsdl and his service name
QName serviceName = new QName(
"IWS_VMS_PUBLIC_DHTservice",
"VisualManagerWS");
ServiceFactory factory = ServiceFactory.newInstance();
Service service = factory.createService(serviceName);
// Call object
Call call = service.createCall();
// operation name
QName operationName = new QName(
"http://10.153.14.29:1024/wsdl/IWS_VMS_PUBLIC_DHT", "WsPublic_DHT_GetData");
call.setOperationName(operationName);
QName portName = new QName(
"IWS_VMS_PUBLIC_DHTPort","IWS_VMS_PUBLIC_DHTPort");
call.setPortTypeName(portName);
// setting return type
call.setReturnType(XMLType.XSD_STRING, String.class);
// specify the RPC-style operation.
call.setProperty(Call.OPERATION_STYLE_PROPERTY,
"rpc");
// and the encoding style
call.setProperty(
Call.ENCODINGSTYLE_URI_PROPERTY,
"http://schemas.xmlsoap.org/soap/encoding/");
// the target endpoint
call.setTargetEndpointAddress(
"http://10.153.14.29:1024/soap/IWS_VMS_PUBLIC_DHT");
//call.
// Invoke the method
Object[] myArgs = {"WS_TALEND=TALEND", 15089, 10, "2012-02-16 00:00", "2012-02-16 20:01", ""};
for (Object o : myArgs)
{
System.out.println(o.toString());
}
Object lsVal = call.invoke(myArgs);
System.out.println("Returned XML String : " + lsVal.toString());
} catch (Throwable th) {
th.printStackTrace();
}
}
}
您是否在服务器端标记Alogin值以获取用户名和密码?如果是这样,那就好了。 还有一件事,您可以在您的客户机代码中以以下方式指定输入参数类型
call.addParameter("arg0",XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("arg1",XMLType.XSD_INT, ParameterMode.IN);
call.addParameter("arg1",XMLType.XSD_INT, ParameterMode.IN);
call.addParameter("arg0",XMLType.XSD_DATETIME, ParameterMode.IN);
call.addParameter("arg0",XMLType.XSD_DATETIME, ParameterMode.IN);
call.addParameter("arg1",XMLType.XSD_INT, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING,String.class);
然后,您可以像以前一样,通过在对象数组中提供所有值来尝试调用服务。尝试此操作。您是否在服务器端标记Alogin值以获取用户名和密码?如果是这样,那就好了。 还有一件事,您可以在您的客户机代码中以以下方式指定输入参数类型
call.addParameter("arg0",XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("arg1",XMLType.XSD_INT, ParameterMode.IN);
call.addParameter("arg1",XMLType.XSD_INT, ParameterMode.IN);
call.addParameter("arg0",XMLType.XSD_DATETIME, ParameterMode.IN);
call.addParameter("arg0",XMLType.XSD_DATETIME, ParameterMode.IN);
call.addParameter("arg1",XMLType.XSD_INT, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING,String.class);
然后,您可以尝试通过像您一样提供对象数组中的所有值来调用服务