解惑

解己之惑,解人之惑

Class has two properties of the same name

开发Web Service并不是很难,但是没有好的例子,网上的一些例子都过于简单,做一个DEMO样的可以跑起来的Web Service确实不难,但是要开发一个真正实用的还是需要花些功夫的。
这个是最近遇到的一个问题,原因就是那些需要Model的Annotation使用不当,在类上面使用了XmlAccessType,然后在getter上也使用了XmlElement,在使用stub的方式作为客户端的时候没有问题,但是使用JAX-WS的方式调用的时候就出现标题中的错误。
这个问题解决后,调用没有问题,也能返回一个对象,但是对象的所有属性全部为null,需要继续解决。
到目前位置,已经使用了下面的Client方式,或多或少存在问题,只有使用stub的方式最好(根据wsdl生成代码)

  • JaxWsProxyFactoryBean,调用成功,但是返回对象为空,和直接的JAX-WS一样
  • ClientProxyFactoryBean,调用失败,Service的方法的名称加了Annotation定义,但是从生成的SOAP信息看,是使用的arg0,arg1这样的形式,所以到Server端以后参数都为null,调用失败
  • 直接JAX-WS(javax.xml.ws.Service),和第一个一样
(Visited 437 times, 1 visits today)

4 Comments

  1. 老刘,考虑过这样一种情况没有。在WS中传递的对象即是输出又是输入的情况:客户端传递的对象在服务器端被修改,服务器端返回的是被修改的传递对象,在这种情况下,在客户端的JVM中是替换原来的instance,还是两个instance共存?我理解是共存。

  2. 呵呵,WS中应该没有这种情况吧,因为传递的是的SOAP消息。不过CXF支持一种Local的Transport类型,在那种情况下才有可能,也仅仅是可能,取决于实现,但是我感觉是不能依赖这种可能,就像EJB规范一样,应该默认是远程调用,虽然不同的容器可能会进行优化而导致在JVM中共享同一个实例。WS应该是比EJB更加“远程”的,因为WS的客户端和服务器的实现都是不确定的,不应该做任何假设。

  3. 老刘,SOAP应该只是消息传输协议,对于JVM中的动作我觉得应该是不关心的,这种情况是否出现应该是由业务逻辑来决定的吧,一个对象如果从客户端被传递到服务器端了,并在服务器端被修改,并由服务器再通过SOAP传递回来,我想应该在client的JVM中在多出一个Instance了了

  4. 是啊,在客户端的JVM中应该是另外一个实例。
    最开始提出这个问题的好像是你啊 :em32:

发表评论

邮箱地址不会被公开。 必填项已用*标注

© 2022 解惑

本主题由Anders Noren提供向上 ↑