【发布时间】:2012-10-16 05:30:52
【问题描述】:
我想知道我是否在 jax-ws 中放了一个泛型方法,比如:
public List<MyCustomClass> getSomething()
jax-ws 支持这个吗? 在客户端,方法的返回会是什么样子?
【问题讨论】:
我想知道我是否在 jax-ws 中放了一个泛型方法,比如:
public List<MyCustomClass> getSomething()
jax-ws 支持这个吗? 在客户端,方法的返回会是什么样子?
【问题讨论】:
您将在客户端获得一个 List(如果 WS 使用者是用另一种语言编写的,则获得一组 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 库类。这意味着,您的类应该有List、Set 和Map(在容器的情况下),因为这些接口比实现类处于更高级别,如果非 Java 客户端尝试这样做,您可能会遇到问题使用您的网络服务方法。
public class ClassC {
List<ClassA> lstClassA; //good!
ArrayList<ClassB> alstClassB; //not very flexible with other languages =\
}
将通过您的 Web 服务的类应该是 POJO(普通旧 Java 对象),而不是服务或业务逻辑层类。为什么?因为在与客户端通信时只有属性值会被编组/解组,所以没有方法代码会出现在您的 Web Service 的合约中。
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 项目中遇到了这三个问题。我希望其他人可以增强此答案或提供带有链接的信息。
【讨论】:
是的,这应该不是问题,但建议使用数组。正如 Luiggi 所说,您会收到List<MyCustomClass>。要添加更多内容,可以找到 JAX-WS here 支持的类型的完整列表
【讨论】: