为什么当我添加对其他bean的引用时,Apache CXF会抛出IllegalAnnotationsException?

时间:2015-03-20 05:42:45

标签: spring web-services grails cxf jax-ws

我有两个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注释的类型。这很奇怪。

1 个答案:

答案 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')