我们正在使用Wildlfy 10和Swagger 1.5.12(Swagger 2.0规范)在我们的应用程序中,我们正在部署 Contract 并实现我们的Web服务,以确保能够在此级别上交换实现 . 暴露我们的网络服务的战争被打包在同一个耳朵里,可以访问它的所有模块 .

swagger定义放在war文件中 . 虽然webservice endpoints 按预期工作,但swagger.json仅包含常规信息,但不包含Api文档 .

调试一段时间后,我得出以下结果:

  • 扫描程序使用 reflections.getTypesAnnotatedWith(Api.class) 发现类

  • 尝试生成配置后,他们正在使用 cls.getAnnotation(annotationClass) ,或者 cls.getAnnotations()annotation = metaAnnotation.annotationType().getAnnotation(annotationClass); 都返回null

在进一步调试之后,我将其缩小到这样一个事实,即附加到类的Annotation由ear-classloader加载,而swagger正在使用war-classloader(因为它放在战争中) . 这符合Wildlfy Documentation,因为war-modules使用不同的类加载器 .

还回答了其他问题

我认为你最终会遇到多个类加载器问题源的其他问题

说实话,还应该说当你在一个ClassLoader中加载同一个类时,很容易得到其他副作用,比如静态复制等等 . 这就是为什么我认为在异国情况下使用swagger的开发人员 - 比如构建系统集成 - 应该警告库使用反射进行代码分析这一事实,因此类加载器很重要 . 资源

在我们的战争中部署 Contract 和ejb模块解决了它,但遗憾的是在我们的架构中没有有效的解决方案 .

问题:

  • 是否有一种(非hacky)方式在耳模块中加载swagger-annotations-jar,在war和ear模块中使用相同的类加载器?

  • 是否可以通过调整swagger配置来解决这个问题? (调整实现不使用反射只是最后的手段)

  • 这可以被视为招摇的错误吗?