用复杂类型包装的数组在Java代码中展开(Axis 1.4)

用复杂类型包装的数组在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似乎难

WSDL如下所示:


预期行为 如果我让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发射器并选中相应的复选框来配置相同类型的选项


这并没有达到目的,但尝试得很好:)不过,深入研究这些工具参数是很好的。