我目前正在尝试使用swagger核心记录现有的API。自从我在wildfly 10上进行部署以来,我使用了swagger core 2.7和resteasy 3。模型类使用@Schema进行注释,因此需要依赖于swagger注释。我遵循了https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Integration-and-configuration]上的教程
因此,我在战争的pom.xml中添加了依赖项,在包含模型类的模块中添加了注释模块依赖项。它可以编译和部署,但是当我浏览到/myapp/openapi.yaml时,我在wildfly控制台中看到以下警告,这些警告是我在web.xml中定义的每个资源(战争中所包含的除外)]
12:52:22,058警告[re.io.swagger.v3.jaxrs2.integration.JaxrsAnnotationScanner](默认任务5)从resourceClasses中加载类时出错:[服务模块加载程序中的[模块“ deployment.rserve-test.ear.at.prismasolutions.test.rserve.web-0.0.1-wildfly-SNAPSHOT.war:main”中的at.prismasolutions.test.render.RPlotFormatParam:java .lang.ClassNotFoundException:来自[来自服务模块加载程序的模块“ deployment.rserve-test.ear.at.prismasolutions.test.rserve.web-0.0.1-wildfly-SNAPSHOT.war:main”中的at.prismasolutions.test.render.RPlotFormatParam。在org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198)在org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363)在org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:351)在org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93)在java.lang.Class.forName0(本地方法)在java.lang.Class.forName(Class.java:264)在io.swagger.v3.jaxrs2.integration.JaxrsAnnotationScanner.classes(JaxrsAnnotationScanner.java:68)在io.swagger.v3.oas.integration.GenericOpenApiContext.read(GenericOpenApiContext.java:470)在io.swagger.v3.jaxrs2.integration.resources.BaseOpenApiResource.getOpenApi(BaseOpenApiResource.java:49)在io.swagger.v3.jaxrs2.integration.resources.OpenApiResource.getOpenApi(OpenApiResource.java:32)在io.swagger.v3.jaxrs2.integration.resources.OpenApiResource $ Proxy $ _ $$ _ WeldClientProxy.getOpenApi(未知源)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在java.lang.reflect.Method.invoke(Method.java:498)在org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:139)在org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:295)在org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:249)在org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:236)在org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:402)在org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:209)在org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:221)在org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)在org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)在javax.servlet.http.HttpServlet.service(HttpServlet.java:790)在io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)在io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)在io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)在org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)处在io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)在io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)在io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)在io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)在io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:53)在io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)在io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)在io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:59)在io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)在io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)在io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)在io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)在io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)在org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)处在io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)在io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)在io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)在io.undertow.servlet.handlers.ServletInitialHandler.access $ 100(ServletInitialHandler.java:81)在io.undertow.servlet.handlers.ServletInitialHandler $ 2.call(ServletInitialHandler.java:138)在io.undertow.servlet.handlers.ServletInitialHandler $ 2.call(ServletInitialHandler.java:135)在io.undertow.servlet.core.ServletRequestContextThreadSetupAction $ 1.call(ServletRequestContextThreadSetupAction.java:48)在io.undertow.servlet.core.ContextClassLoaderSetupAction $ 1.call(ContextClassLoaderSetupAction.java:43)在io.undertow.servlet.api.LegacyThreadSetupActionWrapper $ 1.call(LegacyThreadSetupActionWrapper.java:44)在io.undertow.servlet.api.LegacyThreadSetupActionWrapper $ 1.call(LegacyThreadSetupActionWrapper.java:44)在io.undertow.servlet.api.LegacyThreadSetupActionWrapper $ 1.call(LegacyThreadSetupActionWrapper.java:44)在io.undertow.servlet.api.LegacyThreadSetupActionWrapper $ 1.call(LegacyThreadSetupActionWrapper.java:44)在io.undertow.servlet.api.LegacyThreadSetupActionWrapper $ 1.call(LegacyThreadSetupActionWrapper.java:44)在io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)在io.undertow.servlet.handlers.ServletInitialHandler.access $ 000(ServletInitialHandler.java:81)在io.undertow.servlet.handlers.ServletInitialHandler $ 1.handleRequest(ServletInitialHandler.java:104)在io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)在io.undertow.server.HttpServerExchange $ 1.run(HttpServerExchange.java:805)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)在java.lang.Thread.run(Thread.java:748)
我的web.xml配置:
<servlet> <servlet-name>rserve-resteasy-servlet</servlet-name> <servlet-class> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher </servlet-class> <init-param> <param-name>resteasy.servlet.mapping.prefix</param-name> <param-value>/</param-value> </init-param> <!-- specify scanner implementation --> <init-param> <param-name>openApi.configuration.scannerClass</param-name> <param-value>io.swagger.v3.jaxrs2.integration.JaxrsAnnotationScanner</param-value> </init-param> <!-- pretty print --> <init-param> <param-name>openApi.configuration.prettyPrint</param-name> <param-value>true</param-value> </init-param> <!-- specify resource classes to scan --> <init-param> <param-name>openApi.configuration.resourceClasses</param-name> <param-value> rserve.web.RService, at.prismasolutions.test.RServeBean.evaluation.REvaluationObject, at.prismasolutions.test.RServeBean.evaluation.optima.REvaluationObservationObject, at.prismasolutions.test.render.RPlotFormatParam </param-value> </init-param> </servlet>
仅找到位于war文件中的rserve.web.RService。有没有人有过使用包含耳朵的资源来设置摇摇欲坠的经验?
我目前正在尝试使用swagger核心记录现有的API。自从我在wildfly 10上进行部署以来,我使用了swagger core 2.7和resteasy 3。
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<servlet>
<servlet-name>rserve-resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
<init-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/</param-value>
</init-param>
<!-- specify scanner implementation -->
<init-param>
<param-name>openApi.configuration.scannerClass</param-name>
<param-value>io.swagger.v3.jaxrs2.integration.JaxrsAnnotationScanner</param-value>
</init-param>
<!-- pretty print -->
<init-param>
<param-name>openApi.configuration.prettyPrint</param-name>
<param-value>true</param-value>
</init-param>
<!-- specify resource classes to scan -->
<init-param>
<param-name>openApi.configuration.resourceClasses</param-name>
<param-value> rweb.RService </param-value>
</init-param>
</servlet>
看看:
还考虑使用差的依赖管理来检查常见错误,那可能是我当时的问题:
例如jboss类加载:耳朵中的类无法引用战争类加载器加载的类
类依赖项引用了不同的类,因为它们被注册了两次(war classloader,ear classloader)