【问题标题】:Swagger and web.xmlSwagger 和 web.xml
【发布时间】:2016-02-15 07:28:21
【问题描述】:

我正在尝试使用我的 java rest api 大摇大摆地工作。 我正在关注swagger documentation。但是,我无法大摇大摆地工作。

例如,根据文档,我应该从 swagger 获取一个 json 文件 - 但无论我尝试什么 url,我都没有得到它。

<context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>
    io.swagger.jaxrs.listing.ApiListingResource,
    io.swagger.jaxrs.listing.SwaggerSerializers,
    com.my.service.rest.handler.JsonParseExceptionHandler, 
    com.my.service.rest.handler.IllegalArgumentExceptionHandler, 
    com.my.service.rest.handler.JsonMappingExceptionHandler, 
    com.my.service.rest.handler.RuntimeExceptionHandler
    </param-value>
</context-param>

<servlet>
    <servlet-name>resteasy-servlet</servlet-name>

    <servlet-class>io.swagger.jaxrs.config.DefaultJaxrsConfig</servlet-class> 
    <init-param>
        <param-name>api.version</param-name>
        <param-value>0.1</param-value>
    </init-param>
    <init-param>
        <param-name>swagger.api.basepath</param-name>
        <param-value>http://localhost:8080/indicatorsService</param-value>

        <!-- also not working <param-value>http://localhost:8080/docs</param-value> -->
    </init-param>
</servlet>
<servlet>
    <servlet-name>JbossServlet</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>JbossServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

根据 swagger 文档,如果我转到 http://localhost:8080/indicatorsService/swagger.json,我应该得到 swagger json - 而我得到以下错误

Error in handling REST request. ExpectionMessage: Could not find resource for relative : /swagger.json of full path: http://localhost:8080/indicatorsService/swagger.json: org.jboss.resteasy.spi.NotFoundException: Could not find resource for relative : /swagger.json of full path: http://localhost:8080/indicatorsService/swagger.json
    at org.jboss.resteasy.core.registry.RootSegment.matchChildren(RootSegment.java:360) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.core.registry.RootSegment.matchRoot(RootSegment.java:374) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.core.registry.RootSegment.matchRoot(RootSegment.java:367) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.core.ResourceMethodRegistry.getResourceInvoker(ResourceMethodRegistry.java:307) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:173) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:118) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50) [resteasy-jaxrs-2.3.2.Final.jar:]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_85]

谢谢。

【问题讨论】:

  • 您好,您的服务器启动时没有错误吗?您是否看到它正在日志记录中注册端点?您是否基于 swagger-codegen 工具生成了 Java 服务器?如果是这样,你能分享你运行 codegen 的 Swagger 文件吗?如果没有,也许您可​​以运行 codegen 工具并比较差异?在我看来,您的 localhost:8080/indicatorsService/swagger.json 路径可能不正确 - 也许应该是 localhost:8080/indicatorsService/api/swagger.json
  • 您好,部署时没有错误。该服务工作正常。我没有从 swagger 生成 java 服务器。我只是想为现有服务生成招摇的文档。我已经尝试了您建议的网址以及许多其他网址 - 没有成功。谢谢
  • @Integrating Stuff - 感谢有关审查生成的招摇服务的建议。我一直在这样做,但看不到任何明显的错误。如果有一些错误可以帮助指出方向,那就太好了,但没有。我不知道这是否是 RestEasy、Jboss 或其他问题。我已经尝试了所有逻辑网址。现在只是猜测。
  • 你可以在stackoverflow.com/a/35905415/5076414查看我是如何使用 swagger 和 jax-rs 做到这一点的

标签: java jackson jax-rs resteasy swagger


【解决方案1】:

我的一个应用程序中有类似的配置,只是我使用 Jersey 2 而不是 RestEasy。

我检查了我的web.xml 文件,该文件以类似的方式配置(除了专门用于 Jersey 2 的 servlet 类)。摘录如下:

<servlet>
  <servlet-name>jax-rs-ws</servlet-name>
  <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  <init-param>
    <param-name>javax.ws.rs.Application</param-name>
    <param-value>com.jeff.MyJerseyApp</param-value>
  </init-param>
</servlet>
<servlet-mapping>
  <servlet-name>jax-rs-ws</servlet-name>
  <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

<servlet>
  <servlet-name>swagger-servlet</servlet-name>
  <servlet-class>com.wordnik.swagger.jersey.config.JerseyJaxrsConfig.JerseyJaxrsConfig</servlet-class>
  <init-param>
    <param-name>api.version</param-name>
    <param-value>1.1.0</param-value>
  </init-param>
  <init-param>
    <param-name>swagger.api.basepath</param-name>
    <param-value>http://127.0.0.1:8080/myapp/rest</param-value>
  </init-param>
  <load-on-startup>3</load-on-startup>
</servlet>

这里有一些提示:

  • 我的 Jersey servlet 映射到 /rest/* 模式。全局根/* 也可以,但让我们继续...
  • 在 Swagger servlet 中定义的基本路径在我的应用程序中包含相同的 /rest URI。

此外,我必须使用以下 URL 来检索 JSON 结构的 API 信息:

http://127.0.0.1:8080/myapp/rest/api-docs

其 URI 以相同的 /rest 路径开头。这让我觉得你应该使用以下地址:

http://localhost:8080/indicatorsService/api-docs

希望我猜对了……

【讨论】:

  • 谢谢@JeffMorin - 是的,你的设置看起来确实很相似,我已经尝试了你的建议,以及所有其他看似合乎逻辑的网址。唉,什么都没用。
  • 对不起...我会做更多的调查,如果我发现别的东西我会通知你。
  • 谢谢杰夫 - 非常感谢。
猜你喜欢
  • 2015-06-12
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 2013-10-03
相关资源
最近更新 更多