【问题标题】:Using a custom class as a JAX-WS return type?使用自定义类作为 JAX-WS 返回类型?
【发布时间】:2011-05-17 09:27:08
【问题描述】:

我正在使用 NetBeans 的 Web 服务生成工具。我查看了可用的教程,但找不到有关如何使用自定义类作为返回类型的任何内容。我读过的大部分教程并不比 Hello World 复杂:它们接受和返回简单的类型,如字符串。

假设我想要一个有 3 个字段的类:一个 String、一个 int 和一个 double[]。到目前为止,我可以传递自己的类的唯一方法是创建“信封类”,没有方法,无参数构造函数,并且所有字段都声明为 public。我更喜欢编写标准的 Java 类。显然我不能通过 SOAP 发送方法,但我会认为有一种方法可以在编组类时忽略方法,而只编组字段。

有人告诉我有注释可以促进这一点,但我找不到任何关于如何实现它们的教程。任何指导将不胜感激。

【问题讨论】:

    标签: java jax-ws marshalling


    【解决方案1】:

    如果你使用 NetBeans 接口来设计你的 ws。

    • 点击添加新操作

    • 选择返回类型,浏览您的班级(如图所示)

    【讨论】:

    • 我已经尝试过了,NetBeans 可以生成代码,但是 GlassFish 不会部署任何使用我的自定义类作为返回类型的东西。基本上任何具有 args 构造函数或方法的东西都会被拒绝。这意味着设置字段值的唯一方法是将它们公开:并不完全理想。您列出的方法对您有用吗?也许是 GlassFish 出了问题,而不是我的代码……
    • 好吧,我已经在 tomcat 上部署了这个。你可以在这里发布错误日志
    • 我在朋友的机器上试过了。瞧,一切正常。我责怪 NetBeans 7.0。感谢您的帮助,Jigar Joshi
    【解决方案2】:

    JAX-WS 使用JAXB 来映射类型,因此类应该符合该规范。您可以在 java.xml.bind.annotations 包中找到 JAXB 注释。

    如果你想编组一个非注解的类,遵循 JavaBeans 的规则应该可以工作:

    public class Foo {
      private String bar;
      public String getBar() { return bar; }
      public void setBar(String bar) { this.bar = bar; }
    
      public static void main(String[] args) {
        Foo foo = new Foo();
        foo.setBar("Hello, World!");
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        JAXB.marshal(foo, out);
        foo = (Foo)
            JAXB.unmarshal(new ByteArrayInputStream(out.toByteArray()), Foo.class);
        System.out.println(foo.getBar());
      }
    }
    

    如果您想使用带参数的构造函数等,请查看spec 中关于工厂方法和适配器的部分。

    【讨论】:

    • 感谢 McDowell,关于注释的信息有很大帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多