调用返回complexType的WS

时间:2014-01-16 19:48:30

标签: java web-services axis

我必须调用一个返回类似

的complexType的WS
<WSResponse xmlns="http://uri.org/">
  <ConvertResult>
    <param1>string</param1>
    <param2>string</param2>
    <param3>int</param3>
    <param4>string</param4>
  </ConvertResult>
</WSResponse>

该部分的WSDL是

<s:element name="WSResponse">
    <s:complexType>
       <s:sequence>
          <s:element minOccurs="0" maxOccurs="1" name="ConvertResult" type="tns:ISO"/>
        </s:sequence>
    </s:complexType>
</s:element>
<s:complexType name="ISO">
   <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="param1" type="s:string"/>
      <s:element minOccurs="0" maxOccurs="1" name="param2" type="s:string"/>
      <s:element minOccurs="1" maxOccurs="1" name="param3" type="s:int"/>
      <s:element minOccurs="0" maxOccurs="1" name="param4" type="s:string"/>
   </s:sequence>
 </s:complexType>

我在java中使用此代码来执行此操作

Service service = new Service();
Call call = (Call) service.createCall();

call.setProperty( Call.SOAPACTION_USE_PROPERTY, true);
call.setProperty( Call.SOAPACTION_URI_PROPERTY, "http://uri.org/" + WebMethod);

call.setTargetEndpointAddress(endpointURL);
call.setOperationName(new QName("http://uri.org/", WebMethod));
call.addParameter(new QName("http://uri.org/","param"), XMLType.XSD_STRING, ParameterMode.IN); 
call.setReturnType(new QName("","ISO"), ISO.class);

Object params[]={ param };
Object ret = call.invoke(params);

ISO是

class ISO implements Serializable {
    String param1;
    String param2;
    int param3;
    String param4;
}

但是我得到了

  

反序列化参数'ConvertResult':找不到类型ISO

的反序列化器

我之前在WS调用中没有使用complexTypes,所以我有点迷失。我怎么想收到这个回复?我已经尝试将其添加到通话中

BeanSerializerFactory bsf =   new BeanSerializerFactory(ISO.class,new QName("","ISO"));
BeanDeserializerFactory bdf = new BeanDeserializerFactory(ISO.class,new QName("","ISO"));
call.registerTypeMapping(ISO.class,new QName("","ISO"), bsf, bdf);

this other question建议,但我得到了

  

SimpleDeserializer在尝试反序列化时遇到了一个不期望的子元素。

我想我有点混淆了我尝试过的所有解决方案(没有用)。我知道ws有效,因为我已经尝试将complexType更改为一个简单的字符串(在ws中有相应的更改)并且它有效,所以我必须对返回类型做错了。

你可以帮帮我吗?

PD:我已经尝试为映射和beanDeserializer添加和删除命名空间,但仍然没有运气。

1 个答案:

答案 0 :(得分:0)

好的,要解决这个问题:

我真的很困惑如何将WSDL映射到java代码。我的错误是手工完成ISO课程。我最终使用here

中的代码创建了该存根
import org.apache.axis.wsdl.WSDL2Java;

public class Random {

    public static void main(String[] args) {
        String[] params = new String[] {"-v", "-D", "-o c:/projects/WSTest", "http://URL to WSDL file"};  
        try  {  
            WSDL2Java.main(params);  
        } catch (Exception ex) {  
            ex.printStackTrace()  
        }  
    }
} 

这是WSDL2Java,它拯救了生命。之后,我在文件夹中获得了一堆类,将它们复制到我的项目中,更改了包引用,并且瞧。最后的代码就是这个

call.addParameter(new QName("http://uri.org/","param"), XMLType.XSD_STRING, ParameterMode.IN); 
call.setReturnType(new QName("","ISO"), ISO.class);

Object params[]={ param };
ISO ret = (ISO) call.invoke(params);

我意识到这可能对很多人来说很简单,但我真的很困惑,我得到的不同错误和不同的解决方案让我更加困惑。我将它留在这里,以防它帮助了某人。

doc对某些人也有用。