在jax-ws webservice中泛型类会发生什么?

时间:2012-10-16 05:30:52

标签: java jax-ws cxf

我想知道我是否在jax-ws中添加了泛型方法,例如:

public List<MyCustomClass> getSomething()

jax-ws支持吗? 在客户端,该方法的返回方式是什么样的?

2 个答案:

答案 0 :(得分:7)

如果WS使用者使用其他语言编写,您将在客户端获取List(或MyCustomClass对象的数组)。这不会是个问题。记住要始终编程到接口。

看起来你仍然没有太多练习用Java创建WS,所以我会给你一些建议:

  • 不得发送包含循环引用的2个或更多对象,否则您将以循环引用问题结束。这是因为JAX-WS工具将为请求创建一个无限的XML响应。可能很难发现。我们来看一个案例:

    public class ClassA {
        ClassB instanceOfB;
        //getters and setters...
    }
    
    public class ClassB {
        ClassA instanceOfA;
        //getters and setters...
    }
    
    public class MyJAXWS {
    
        @WebMethod
        public ClassA getClassA() {
             ClassA classA = new ClassA();
             ClassB classB = new ClassB();
             classB.setInstanceOfA(classA);
             classA.setInstanceOfB(classB);
             return classA; //boom! circular reference problems!
        }
    }
    
  • 必须始终在返回类中具有接口,而不是特定的Java库类。这意味着,您的类应该有ListSetMap(如果是容器),因为这些接口的级别高于实现类,如果是非Java客户端尝试使用您的Web服务方法。

    public class ClassC {
    
        List<ClassA> lstClassA; //good!
        ArrayList<ClassB> alstClassB; //not very flexible with other languages =\
    }
    
  • 将通过Web服务的类应该是POJO(Plain Old Java Objects),而不是服务或业务逻辑层类。为什么?由于在与客户端通信时,只有属性值将被编组/解组,因此无方法代码将出现在Web服务的合同中。

    public class ClassD {
        private int intValue;
        //naive business logic method
        //won't be generated in the WSDL for the clients/consumers of the Web Services
        public void printIntValue() {
            //pretty simple implementation
            System.out.println(this.intValue);
        }
    }
    

我在上一次使用Java的SOA项目中遇到过这三个问题。我希望其他人可以提高这个答案或提供链接信息。

答案 1 :(得分:1)

是的,这应该不是问题,但建议使用数组用法。正如Luiggi所说,你会收到List<MyCustomClass>。要添加更多内容,可以通过JAX-WS here

查找受支持类型的完整列表