我想知道我是否在 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 客户端尝试使用您的 Web 服务方法,您可能会遇到问题。
public class ClassC {
List<ClassA> lstClassA; //good!
ArrayList<ClassB> alstClassB; //not very flexible with other languages =\
}
The classes that will go through your web services should be POJOs (Plain Old Java Objects), not service or business logic layer classes. Why? Because only the attributes values will be marshalled/unmarshalled when communicating with the clients, no method code will appear in the contract of your 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);
}
}
I've faced these three problems in my last SOA project with Java. I hope other people could enhance this answer or provide info with links.
是的,这应该不是问题,但建议使用数组。正如 Luiggi 所说,您将收到一个List<MyCustomClass>
. 要添加更多内容,可以在此处找到 JAX-WS 支持的类型的完整列表