java 使用 JAXRPC 将字符串数组作为参数发送到 Web 服务方法

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6543541/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 16:17:26  来源:igfitidea点击:

Sending array of string as a parameter to web service method using JAXRPC

javaweb-servicesaxisjax-rpc

提问by Anuj Balan

I've got problem sending an array of string as parameter to a web service method, given in a specific wsdl. When am trying to send an array of strings, I get the following error.

我在将字符串数组作为参数发送到特定 wsdl 中给出的 Web 服务方法时遇到问题。当我尝试发送一个字符串数组时,出现以下错误。

Error:

错误:

AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode: 
faultString: org.xml.sax.SAXException: Bad types (class java.util.ArrayList > 
class usdjws65.ArrayOfString)
faultActor: 
faultNode: 
faultDetail: 
            {http://xml.apache.org/axis/}hostname:SSLSPSD001

org.xml.sax.SAXException: Bad types (class java.util.ArrayList -> class usdjws65.ArrayOfString)
at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
at  org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)

Code written:

编写的代码:

Call call1 = objService1.createCall(port1);
call1.setTargetEndpointAddress(targetEndPoint);
call1.addParameter("int_1", XMLType.XSD_INT, Integer.class,
                ParameterMode.IN);
        call1.addParameter("String_1", QNAME_TYPE_STRING, ParameterMode.IN);
        call1.addParameter("String_2", QNAME_TYPE_STRING_ARRAY,
                java.lang.String[].class, ParameterMode.IN);
        call1.addParameter("String_3", QNAME_TYPE_STRING_ARRAY,
                java.lang.String[].class, ParameterMode.IN);
        call1.addParameter("String_4", QNAME_TYPE_STRING, ParameterMode.IN);
        call1.addParameter("String_5", QNAME_TYPE_STRING_ARRAY,
                java.lang.String[].class, ParameterMode.IN);
        call1.addParameter("String_6", QNAME_TYPE_STRING, ParameterMode.IN);
        call1.addParameter("String_7", QNAME_TYPE_STRING, ParameterMode.IN);

        // --- Done adding PARAM's

        String[] attrVals = { "description", "test from soapUI",
                "customer", ticketHandle, "type", "I" };
        String[] attributes = { "status", "ref_num" };

        Object[] params1 = { new Integer(sid), ticketHandle, attrVals, "",
                "cr_tpl:400005", attributes, "", "" };

        String res = null;
        try {
            call1.invoke(params1);

Thanks !!!! -Aj

谢谢 !!!!-Aj

=========================================================

================================================== ========

Update-1:

更新 1

I added a class named ArrayOfString with following code in it. protected java.lang.String[] string;

我添加了一个名为 ArrayOfString 的类,其中包含以下代码。受保护的 java.lang.String[] 字符串;

public ArrayOfString() {
}

public ArrayOfString(java.lang.String[] string) {
    this.string = string;
}

public java.lang.String[] getString() {
    return string;
}

public void setString(java.lang.String[] string) {
    this.string = string;
}

and thus did the following, ArrayOfString attrVals = new ArrayOfString(); attrVals.setString(new String[] { "customer", "test from soapUI", "customer", ticketHandle, "type", "I" });

因此做了以下,ArrayOfString attrVals = new ArrayOfString(); attrVals.setString(new String[] { "customer", "test from soapUI", "customer", ticketHandle, "type", "I" });

Similarly, for attributes variable of type 'ArrayOfString'.

同样,对于“ArrayOfString”类型的属性变量。

But now, I get the following error::

但是现在,我收到以下错误::

AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString: java.io.IOException: No serializer found for class ArrayOfString in registry org.apache.axis.encoding.TypeMappingDelegate@ef2c60 faultActor: faultNode: faultDetail: {http://xml.apache.org/axis/}stackTrace:java.io.IOException: No serializer found for class ArrayOfString in registry org.apache.axis.encoding.TypeMappingDelegate@ef2c60 at org.apache.axis.encoding.SerializationContext.serializeActual(SerializationContext.java:1507) at org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:980) at org.apache.axis.encoding.SerializationContext.outputMultiRefs(SerializationContext.java:1055) at org.apache.axis.message.SOAPBody.outputImpl(SOAPBody.java:145) at org.apache.axis.message.SOAPEnvelope.outputImpl(SOAPEnvelope.java:478) at org.apache.axis.message.MessageElement.output(MessageElement.java:1208) at org.apache.axis.client.Call.invoke(Call.java:2757) at org.apache.axis.client.Call.invoke(Call.java:2443) at org.apache.axis.client.Call.invoke(Call.java:2366) at org.apache.axis.client.Call.invoke(Call.java:1812)

AxisFault faultCode: { http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString: java.io.IOException: 在注册表 org.apache.axis.encoding.TypeMappingDelegate@ 中找不到类 ArrayOfString 的序列化程序ef2c60 faultActor:faultNode:faultDetail:{ http://xml.apache.org/axis/}stackTrace:java.io.IOException: 在 org.apache.axis.encoding.SerializationContext.serializeActual(SerializationContext.java:1507) 的注册表 org.apache.axis.encoding.TypeMappingDelegate@ef2c60 中找不到类 ArrayOfString 的序列化程序。 apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:980) at org.apache.axis.encoding.SerializationContext.outputMultiRefs(SerializationContext.java:1055) at org.apache.axis.message.SOAPBody.outputImpl(SOAPBody. java:145) 在 org.apache.axis.message.SOAPEnvelope.outputImpl(SOAPEnvelope.java:478) 在 org.apache.axis.message.MessageElement.output(MessageElement.java:1208) 在 org.apache.axis.client .Call.invoke(Call.java:2757) 在 org.apache.axis.client.Call.invoke(Call.java:2443) 在 org.apache.axis.client.Call.invoke(Call.java:第 2366 章



Update-2:

更新 2:

Here is an update on the problem that am facing. In the WSDL file, I found something like this,

这是有关我面临的问题的更新。在WSDL文件中,我发现了这样的东西,

complexType name="ArrayOfString"
sequence
element maxOccurs="unbounded" name="string" type="xsd:string" / 
/sequence
/complexType

Well, now that am meant to use this method,

好吧,既然我打算使用这种方法,

 <element name="createRequest">
<complexType>
<sequence>
<element name="sid" type="xsd:int" /> 
<element name="creatorHandle" type="xsd:string" /> 
<element name="attrVals" type="impl:ArrayOfString" /> 
<element name="propertyValues" type="impl:ArrayOfString" /> 
<element name="template" type="xsd:string" /> 
<element name="attributes" type="impl:ArrayOfString" /> 
<element name="newRequestHandle" type="xsd:string" /> 
<element name="newRequestNumber" type="xsd:string" /> 
</sequence>
</complexType>
</element>

Now, I tried sending the parameters 'attrVals','attibutes' like this

现在,我尝试像这样发送参数 'attrVals','attributes'

ArrayOfstring attrVals = new ArrayOfstring();
    ArrayOfstring attributes = new ArrayOfstring();
    attrVals.setString(new String[] { "customer", "test from soapUI",
            "customer", ticketHandle, "type", "I" });
    attributes.setString(new String[] { "status", "ref_num" });

Its throwing the following exception

它抛出以下异常

AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode: 
faultString: java.io.IOException: No serializer found for class org.tempuri.complex.data.arrays.xsd.ArrayOfstring in registry org.apache.axis.encoding.TypeMappingDelegate@11e1e67
faultActor: 
faultNode: 
faultDetail: 
{http://xml.apache.org/axis/}stackTrace:java.io.IOException: No serializer found  for class org.tempuri.complex.data.arrays.xsd.ArrayOfstring in registry org.apache.axis.encoding.TypeMappingDelegate@11e1e67
at org.apache.axis.encoding.SerializationContext.serializeActual(SerializationContext.java:1507)
at org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:980)

采纳答案by Anuj Balan

The above error has been solved. I simply registered the ArrayOfString class, String[] with the TypeRegistryMapping class. Now, it doesn't throw the above serialize error. Code edited is:

上面的错误已经解决了。我只是用 TypeRegistryMapping 类注册了 ArrayOfString 类 String[]。现在,它不会抛出上述序列化错误。编辑的代码是:

    ServiceFactory factory1 = ServiceFactory.newInstance();
    QName qnTick = new QName("http://soapinterop.org/xsd", "ArrayOfString");
    Service serviceTickReq = factory1.createService(qnTick);
    // Service serviceTickReq = new org.apache.axis.client.Service();
    TypeMappingRegistry tmr = (TypeMappingRegistry) serviceTickReq
            .getTypeMappingRegistry();
    TypeMapping tm = (TypeMapping) tmr.getDefaultTypeMapping();
    tm.register(ArrayOfString.class, qnTick, new BeanSerializerFactory(
            ArrayOfString.class, qnTick), new BeanDeserializerFactory(
            ArrayOfString.class, qnTick));

    TypeMappingRegistry tmr1 = (TypeMappingRegistry) serviceTickReq
            .getTypeMappingRegistry();
    TypeMapping tm1 = (TypeMapping) tmr1.getDefaultTypeMapping();
    tm1.register(String[].class, qnTick, new BeanSerializerFactory(
            String[].class, qnTick), new BeanDeserializerFactory(
            String[].class, qnTick));