【问题标题】:Sending array of string as a parameter to web service method using JAXRPC使用 JAXRPC 将字符串数组作为参数发送到 Web 服务方法
【发布时间】:2011-09-26 11:27:47
【问题描述】:

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

错误:

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)

编写代码:

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);

谢谢!!!! -Aj

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

更新 1

我添加了一个名为 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;
}

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

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

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

AxisFault 故障代码:{http://schemas.xmlsoap.org/soap/envelope/}Server.userException 故障子代码: faultString:java.io.IOException:在注册表 org.apache.axis.encoding.TypeMappingDelegate@ef2c60 中找不到类 ArrayOfString 的序列化程序 故障演员: 故障节点: 故障详情: {http://xml.apache.org/axis/}stackTrace:java.io.IOException: 在注册表 org.apache.axis.encoding.TypeMappingDelegate@ef2c60 中找不到类 ArrayOfString 的序列化程序 在 org.apache.axis.encoding.SerializationContext.serializeActual(SerializationContext.java:1507) 在 org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:980) 在 org.apache.axis.encoding.SerializationContext.outputMultiRefs(SerializationContext.java:1055) 在 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) 在 org.apache.axis.client.Call.invoke(Call.java:1812)


更新 2:

这里是对所面临问题的更新。在 WSDL 文件中,我发现了这样的内容,

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

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

 <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>

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

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" });

它抛出以下异常

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)

【问题讨论】:

  • 您是否尝试过使用 WSDL2Java 生成具有类型的客户端代码?您可以从那里获取 ArrayOfString 及其序列化程序。
  • 我尝试了 Eclipse 的 WSDL2JAVA CodeGen 插件。我已经输入了所有必需的详细信息,但它给了我 -'InvocationTargetException'。
  • 您是否检查过您的网络服务已启动?接缝表明您使用了错误的网址或网络服务已关闭。
  • 这个问题已经解决了。我已经在下面更新了答案(在Update-2之后)。但是 WSDL2JAVA CodeGen 的问题仍然存在。

标签: java web-services axis jax-rpc


【解决方案1】:

上述错误已解决。我只是用 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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    相关资源
    最近更新 更多