用复杂类型包装的数组在Java代码中展开(Axis 1.4)
WSDL如下所示:用复杂类型包装的数组在Java代码中展开(Axis 1.4),java,web-services,serialization,axis,Java,Web Services,Serialization,Axis,WSDL如下所示: 预期行为 如果我让Axis 1.4基于WSDL生成Java代码,我希望我的对象中有以下字段: 公共类MyComplexObject{ 私人家长; } Parent类将由子对象的数组组成 公共类父类{ 私生子女[]子女; } 实际行为 实际行为是,子对象的列表直接在父对象级别定义: 公共类MyComplexObject{ 私生子女[]父母; } 当我们通过填充数组调用webservice时,它将生成以下XML: ... ... 导致服务器端出现故障。Axis似乎难
预期行为
如果我让Axis 1.4基于WSDL生成Java代码,我希望我的对象中有以下字段:
公共类MyComplexObject{
私人家长;
}
Parent
类将由子对象的数组组成
公共类父类{
私生子女[]子女;
}
实际行为
实际行为是,子对象的列表直接在父对象级别定义:
公共类MyComplexObject{
私生子女[]父母;
}
当我们通过填充数组调用webservice时,它将生成以下XML:
...
...
导致服务器端出现故障。Axis似乎难以处理复杂类型的嵌套数组。是否有人面临相同的问题并知道任何解决方法/修复方法
调查结果
经过一些调查,我能够通过向XSD定义添加一个虚拟字段来产生预期的行为:
在这种情况下,Axis似乎正确地创建了一个父对象包装器对象:
公共类父类{
私有字符串虚拟;
私生子女[]子女;
}
我的XML输出是正确的:
...
...
...
看来这确实是Axis 1.4中的一个bug…您是否尝试过在wsdl2java
命令中使用-W
选项
从:
-W,--noWrapped
这将关闭对所谓“包装”文档/文字样式操作的特殊处理。默认情况下,WSDL2Java将
认识到以下情况:
- 如果输入消息包含一个单独的部分
- 这个部分是一个元素
- 元素与操作具有相同的名称
- 元素的复杂类型没有属性
当它看到这一点时,WSDL2Java将“展开”顶级元素,并将元素的每个组件作为
活动这种类型的WSDL是Microsoft.NET web的默认值
服务,它在此顶级架构中封装RPC样式的参数
元素
也许这可以解决它。我最近找到了一个解决方案wsdl2java
似乎有一个未记录的-w
选项,它是--wrapparrays
的缩写。如果使用SoapUI生成类,则可以选择以下选项:
如上所述,此选项将为“某些模式数组模式”创建类,如我的问题中概述的模式
如果您使用Eclipse生成web服务客户机,您可以通过转到Eclipse首选项下的Axis发射器并选中相应的复选框来配置相同类型的选项
这并没有达到目的,但尝试得很好:)不过,深入研究这些工具参数是很好的。