我有两个Web服务类,我的意思是使用Apache CXF作为SOAP服务公开。其中一项服务是指另一项服务作为其运营的一部分。我已经将Apache CXF设置到我的Grails应用程序(没有插件),并通过resources.groovy
(Spring Bean DSL)设置我的Web服务。
说我有以下课程:
@WebService
BookService {
//class definition
}
和
@WebService
LibraryService {
BookService bookService
//class definition
}
我在resources.groovy
中声明它们如下(省略名称空间声明):
bookService(BookService)
jaxws.endpoint(id: 'bookService', implementor: "#bookService",
address: '/book')
libraryService(LibraryService) {
bookService = ref('bookService')
}
jaxws.endpoint(id: 'libraryService', implementor: "#libraryService",
address: '/library')
但是,每次我运行我的应用时(通过grails run-app
),我都会IllegalAnnotationsException
:
Caused by IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
->> 106 | check in com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder
我不明白为什么会这样。我是Apache CXF的新手,所以我希望有人可以就此启发我。
更新:
我发现CXF会为我在服务类中声明的任何私有字段抛出异常,除非它们是用@XmlRootElement
注释的类型。这很奇怪。
答案 0 :(得分:0)
要解决这个问题,我所做的是define a service endpoint interfaces (SEIs),它几乎只是Java / Groovy接口,用于我的服务。我不确定问题是由于Groovy在后台添加的功能,还是CXF的JAX-WS实现或规范本身确实存在问题,但即使将我的服务转换为Java ,我仍然得到错误。
因此,LibraryService
现在看起来像是:
@WebService
interface LibraryService {
//class definition
}
和具体实施:
@WebService
class LibraryServiceImpl implements LibraryService {
BookService bookService
//class definition
}
和bean定义:
libraryService(LibraryServiceImpl) {
bookService = ref('bookService')
}
jaxws.endpoint(id: 'libraryService', implementor: "#libraryService",
address: '/library')