【问题标题】:Groovy & Jax-ws: @WebMethod annotation ignoredGroovy & Jax-ws:@WebMethod 注释被忽略
【发布时间】:2009-11-20 16:03:34
【问题描述】:

我最近发现了一个使用 groovy 和 jax-ws 实现 We3bService 的示例: 问题是@webmethod 注释似乎被忽略了。

这是groovy脚本的源代码:

import javax.jws.soap.*
import javax.jws.*
import javax.xml.ws.*
import javax.xml.bind.annotation.*

@XmlAccessorType(XmlAccessType.FIELD)
class Book {
    String name
    String author
}
@WebService (targetNamespace="http://predic8.com/groovy-jax/")
@SOAPBinding(parameterStyle=SOAPBinding.ParameterStyle.BARE)
class BookService{

    @WebMethod
    def add(Book book){
        println "Name of the book: ${book.name}"
    }
}

Endpoint.publish("http://localhost:9000/book", new BookService())

这是捕获的异常: 捕获:com.sun.xml.internal.ws.model.RuntimeModelerException: 运行时建模器错误:SEI BookService 的方法 setProperty 注释为 BARE,但它有多个绑定到正文的参数。这是无效的。请使用注释对方法进行注释:@SOAPBinding(parameterStyle=SOAPBinding.ParameterStyle.WRAPPED) 在 wstest.run(wstest.groovy:21)

【问题讨论】:

  • 我知道这是很久以前的事了,但你真的解决了这个问题吗,我遇到了同样的错误,但不知道该怎么办?

标签: groovy jax-ws web-services


【解决方案1】:

它不会忽略您的@WebMethod。如果是这样,您将不会看到任何有关“裸露”和“包装”的消息。

尝试将def 的返回类型更改为void

【讨论】:

  • 如果一个类只使用@WebService 和非@WebMethod 注释进行注释,我认为 jax-ws 会尝试公开该类的所有方法。如果注释 @WebMethod 存在,则 jax-ws 尝试仅公开带注释的方法。如果我是正确的,抛出的异常是指方法“setProperty”,我认为这是 groovy 对象实现的一部分。
【解决方案2】:

根据 JAX-WS (JSR-224) 规范,如果在类型级别使用 @SoapBinding 注释,则指定类中所有方法的 WSDL 映射样式。这包括 Groovy 添加的那些。将@SoapBinding 移至方法级别应该可以解决问题。

【讨论】:

    【解决方案3】:

    参考这个问题:wsimport how to create web service client from WSDL for http:binding GET/POST 是同样的问题。在您的情况下,您在类 BookService 中有方法 setProperty ,并且根据错误,它有多个参数。确定你的服务实现中是否真的需要这个方法,如果是,把这个方法标记为私有的(如果你在你的服务操作中使用这个方法)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      相关资源
      最近更新 更多