为什么axis2 1.6.2 java2wdsl.sh会忽略复杂类型的类成员

为什么axis2 1.6.2 java2wdsl.sh会忽略复杂类型的类成员,java,jaxb,wsdl,axis2,Java,Jaxb,Wsdl,Axis2,假设我有一个ClassA,它包含一些String类型的成员,还有一个ClassB数组的成员,而ClassB数组又只包含一个String成员。大概是这样的: public class ClassB{ private String string1; public ClassB(){ string1 = "value1"; } } public class ClassA{ private String string1; private St

假设我有一个ClassA,它包含一些String类型的成员,还有一个ClassB数组的成员,而ClassB数组又只包含一个String成员。大概是这样的:

public class ClassB{

    private String string1;
    public ClassB(){
        string1 = "value1";
    }
}

public class ClassA{

    private String string1;
    private String string2;
    private ClassB[] classB = null;

    public ClassA(){
        string1 = "value1";
        string2 = "value2";
        classB = new ClassB[2];
        classB[0] = new ClassB();
        classB[1] = new ClassB();
    }
}
现在,我在端点类中定义了一个成员函数,如下所示:

//...
public ClassA getClassA(){
    return new ClassA();
}
//...
这段代码显然是无用的,不完整的,甚至可能是错误的,因为我是在脑子里写的,但它证明了我的观点

当我在这个类(或类似的构造)上运行java2wsdl.sh时,我得到了一个.wsdl文件,但是数组ClassB[]被忽略。 我知道axis2默认使用JAXB序列化,我尝试使用注释控制输出,但没有效果


如何更改行为以使ClassB[]包含在.wsdl文件中?

实现此功能的一个必要(但可能不是充分)条件是将ClassB声明为静态。

不幸的是,这是不可接受的。我需要许多ClassA实例,每个实例都有自己的ClassB数组。顺便说一句,为什么静态ClassB可以工作?我想说的是,所呈现的情况非常普遍,人们会期望Axis2能够处理它。我当然可以自己编辑生成的.wsdl,但这会阻止我的自动构建系统。请注意,我的建议不是将classB属性声明为static,而是将classB作为静态内部类。不支持非静态内部类的原因是它们有对外部类实例的隐式引用,并且没有通用的方法将这种关系映射到XML。好的,我明白你的意思了。在发布了这个问题之后,我已经发现创建contract last Web服务是一个棘手的问题,因为WSDL仅限于可以用XML表示的内容,而WSDL不能(也不应该)知道特定于实现的数据类型。我决定根据自己的喜好编辑.wsdl文件,并将其用作契约优先方法的基础。我还决定放弃Axis2并使用ApacheCXF。我还研究了SpringWS,但我认为契约优先CXF是满足我需求的最佳选择。