我有一个简单的网络服务。其中一个公开的方法返回类型为“Data”的java对象。此Data类有一个名为“getName()”的方法。我编译项目,在其上运行“wsgen”,然后启动服务(使用JDK6的嵌入式HTTP服务器,而不是tomcat或glassfish等)。
到目前为止,我可以在浏览器的相应网址上看到wsdl。
但是,当我尝试将wsdl导入另一个项目时,导入过程成功创建了“Data”类(这是在服务器项目中找到的类),但是没有为该类创建方法,所以我不能做“data.getName()”之类的事情。
我的问题是“getName()”方法存在于服务器项目的Data类中,但是在客户端项目中,虽然创建了Data类,但是“getName()”方法不会由wsdl导入过程。
我做错了什么?
答案 0 :(得分:1)
WSDL不包含有关方法中逻辑的任何信息,因此您不能 生成内部对象的代码。
简单的解决方案是将生成的客户端类替换为您使用服务器端的同一个类,但这可能被认为是错误的样式。
传递给WS的对象应该是简单的数据持有者,而没有特殊的逻辑 你不仅限于原始类型,JAXB甚至可以处理非常复杂的对象,但你不能将自定义逻辑从服务器复制到客户端,这样的行为就无法标准化并导致代码重复。
答案 1 :(得分:0)
除非客户端和服务器在其CLASSPATH中都有一个JAR文件,让它们都知道“数据”的含义,否则它无法工作。您需要创建一个可以分发的公共JAR。
将对象放在Web服务签名中太脆弱了。非Java客户端永远不会使用您;对课程的任何更改都会影响整个系统。
这是一种更常见的做法,从合同开始并用XML架构,JSON或REST表达它,让客户端和服务器将这些数据映射到他们认为合适的任何对象。我建议你的网络服务也采用这种方法。