我最近发现了一个使用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,但它有多个绑定到body的参数。这是无效的。请使用注释注释方法:@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 在wstest.run(wstest.groovy:21)
答案 0 :(得分:0)
它不会忽略您的@WebMethod
。如果是这样,你就不会看到任何关于'Bared'和'Wrapped'的消息。
尝试使用def
更改void
返回类型。
答案 1 :(得分:0)
根据JAX-WS(JSR-224)规范,如果在类型级别@SoapBinding
使用,则注释指定类中所有方法的WSDL映射样式。这包括Groovy添加的那些。将@SoapBinding
移至方法级别可以解决问题。
答案 2 :(得分:0)
请参阅此问题:wsimport how to create web service client from WSDL for http:binding GET/POST 是同样的问题。在您的情况下,您在BookService类中有方法 setProperty ,并且根据错误,它有多个参数。确保在服务实现中确实需要此方法,如果是这样,请将此方法标记为私有(如果您在服务操作中使用此方法)