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

Why does Apache CXF throw IllegalAnnotationsException when I add reference to other beans?

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

为了解决这个问题,我所做的是 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')