【问题标题】:Why does axis2 1.6.2 java2wdsl.sh ignore class members of complex type为什么axis2 1.6.2 java2wdsl.sh会忽略复杂类型的类成员
【发布时间】:2012-09-06 16:59:15
【问题描述】:

假设我有一个 ClassA,其中包含一些 String 类型的成员和 ClassB 数组的 1 个成员,而 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 文件中?

【问题讨论】:

    标签: java jaxb wsdl axis2


    【解决方案1】:

    完成这项工作的必要(但可能不是充分)条件是将 ClassB 声明为静态。

    【讨论】:

    • 很遗憾,这是不可接受的。我需要许多 ClassA 实例,每个实例都有自己的 ClassB 数组。为什么静态 ClassB 会顺便工作?所呈现的案例足够普遍,以至于我会说 Axis2 能够应对它。我当然可以自己编辑生成的 .wsdl,但这会破坏我的自动构建系统。
    • 请注意,我的建议不是将classB属性声明为静态,而是将ClassB设为静态内部类。不支持非静态内部类的原因是它们具有对其外部类实例的隐式引用,并且没有通用方法将这种关系映射到 XML。
    • 好的,我明白你的意思了。在发布了这个问题之后,我已经发现创建最后契约的 Web 服务是一堆蠕虫,因为 WSDL 仅限于可以用 XML 表示的内容,而 WSDL 不能(也不应该)知道实现特定的数据类型。我决定根据自己的喜好编辑 .wsdl 文件,并将其用作合同优先方法的基础。我还决定放弃 Axis2 并使用 Apache CXF。我还查看了 Spring WS,但我认为合约优先 CXF 是满足我要求的最佳选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2014-10-24
    相关资源
    最近更新 更多