Swagger 2.x JaxrsAnnotationScanner找不到位于耳朵中的资源类

问题描述 投票:1回答:1

我目前正在尝试使用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。

可悲的是,我不记得实际上哪个步骤导致了解决此问题,但是最终我从web.xml中删除了resourceClasses(战争中包含的服务端点类资源RService除外)
我没有使用任何javax.ws.rs.Application的派生产品,而是在参数resteasy.scan中注册了资源
我的web.xml配置包含

<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>

看看:

resteasy swagger core example

还考虑使用差的依赖管理来检查常见错误,那可能是我当时的问题:

例如jboss类加载:耳朵中的类无法引用战争类加载器加载的类

类依赖项引用了不同的类,因为它们被注册了两次(war classloader,ear classloader)

jakarta-ee swagger wildfly resteasy
1个回答
0
投票
我的web.xml配置包含
© www.soinside.com 2019 - 2024. All rights reserved.