我们正在使用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配置来解决这个问题? (调整实现不使用反射只是最后的手段)
-
这可以被视为招摇的错误吗?