简体   繁体   English

Swagger UI在index.html页面上不显示任何内容

[英]Swagger UI Not Displaying Any Content On index.html Page

UPDATED with SOLUTION below!!! 更新以下解决方案!!!
////////////////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////
Thanks to the advice of Ron below I slightly modified my setup to use BeanConfig instead of SwaggerConfig and got this working. 感谢Ron的建议,我略微修改了我的设置,使用BeanConfig而不是SwaggerConfig,并使其正常工作。 In order to do this I had to modify the servlet and also (and this is where I believe the missing piece was) add the BeanConfig entry into the spring application context file so that spring picks up the resources. 为了做到这一点,我不得不修改servlet,并且(这是我认为缺少的部分)将BeanConfig条目添加到spring应用程序上下文文件中,以便spring获取资源。 I included the updates below with comments in my code showing the old and new/updated code. 我在下面的更新中包含了我的代码中的注释,显示了旧的和新的/更新的代码。 It's possible I could've continued with the SwaggerConfig (maybe I was just missing something in the spring application context file for that as well?) but the BeanConfig works so I'm going to leave it as is. 有可能我可以继续使用SwaggerConfig(也许我刚刚在Spring应用程序上下文文件中遗漏了一些东西?)但是BeanConfig可以工作,所以我将保留原样。
////////////////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////

I'm trying to get Swagger running with my local REST-based Java App and have made quite a bit of progress. 我试图让Swagger运行我的本地基于REST的Java应用程序并取得了相当大的进步。 However, I seem to be missing something easy when I'm trying to get the Swagger UI working. 但是,当我试图让Swagger UI工作时,我似乎错过了一些简单的东西。

Whenever I actually hit this address: http://localhost:9082/mbl/index.html I'm getting the little green swagger header at the top but a blank white body with no content underneath. 每当我真正点击这个地址时: http:// localhost:9082 / mbl / index.html我在顶部得到一个小绿色招摇头,但是一个空白的白色身体,下面没有任何内容。 Shouldn't I be seeing more than this in the body of the page? 我不应该在页面正文中看到更多吗?

My stack is this: Java 6 / Wink / Spring 3.1 / Jackson 2.5 / JAX-RS (JSR-311) and I'm using the following Swagger jars: swagger-annotations-1.3.10.jar / swagger-core_2.10-1.3.10.jar / swagger-jaxrs_2.10-1.3.10.jar. 我的堆栈是这样的:Java 6 / Wink / Spring 3.1 / Jackson 2.5 / JAX-RS(JSR-311),我正在使用以下Swagger罐子:swagger-annotations-1.3.10.jar / swagger-core_2.10- 1.3.10.jar / swagger-jaxrs_2.10-1.3.10.jar。

Now I've managed to get some json displaying that looks like this when i hit http://localhost:9082/mbl/services/api-docs : 现在我设法得到一些json显示,当我点击http:// localhost:9082 / mbl / services / api-docs时

{"apiVersion":"1.0","swaggerVersion":"1.2","info":{"title":"Java API","description":"The following documentation contains the REST Service API useful for interacting with web services.","termsOfServiceUrl":"terms of service","contact":"email@test.com","license":"license type","licenseUrl":"license url"}}

I can see that this is being generated from my SwaggerServlet.java which looks like this: 我可以看到这是从我的SwaggerServlet.java生成的,如下所示:

package com.somewhere.mblsvc.web;

import...

public class SwaggerServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    /* additional working code */
    BeanConfig beanConfig;

    public void setBeanConfig(BeanConfig beanConfig) {
        this.beanConfig = beanConfig;
    }
    /* end additional working code */    

    @Override
    public void init(ServletConfig servletConfig) {
        try {
        /* code from original post*/
        //  SwaggerConfig swaggerConfig = new SwaggerConfig();
        //  ConfigFactory.setConfig(swaggerConfig);
        //  swaggerConfig.setBasePath("/mbl/services");
        //  swaggerConfig.setApiVersion("1.0");
        //  swaggerConfig.setApiInfo(new ApiInfo("Java API", "The following //documentation contains the REST Service API useful for interacting with web //services.", "terms of service", "email@test.com", "license type", "license //url"));
        //  ScannerFactory.setScanner(new DefaultJaxrsScanner());
        //  ClassReaders.setReader(new DefaultJaxrsApiReader());
        /* end code from original post*/

        /* updated working code */
        beanConfig.setBasePath("/mbl/x-services");
        beanConfig.setVersion("1.0");
        beanConfig.setResourcePackage("com.somewhere.mblsvc.resources");
        beanConfig.setScan(true);
        /* end updated working code */

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Also, I have the following in my spring application context xml file: 另外,我在我的spring应用程序上下文xml文件中有以下内容:

<bean class="org.apache.wink.spring.Registrar">
    <property name="classes">
        <set value-type="java.lang.Class">
        </set>
    </property>
    <property name="instances">
        <set>
            <ref local="jaxbProvider" />
            <ref local="apiDeclarationProvider" />
            <ref local="apiListingResourceJson" />
            <ref local="resourceListingProvider" />
        </set>
    </property>

<!-- Jackson Providers -->
<bean id="jaxbProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider" >
    <property name="mapper" ref="jacksonObjectMapper"/>
</bean>

<bean id="jacksonObjectMapper" class="com.fasterxml.jackson.databind.ObjectMapper" >
    <property name="annotationIntrospector" ref="jacksonAnnotationIntrospector" />
</bean>

<bean id="jacksonAnnotationIntrospector" class="com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair" >
    <constructor-arg ref="primaryAnnotationIntrospector" />
    <constructor-arg ref="secondaryAnnotationIntrospector" />
</bean>

<bean id="primaryAnnotationIntrospector" class="com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector" />
<bean id="secondaryAnnotationIntrospector" class="com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector" />

<!-- Swagger Configuration and Providers -->

<!-- additional working code -->
<bean id="beanConfig" class="com.wordnik.swagger.jaxrs.config.BeanConfig">
    <property name="title" value="Java API"/>
    <property name="version" value="1.0" />
    <property name="basePath" value="/mbl/services"/>
    <property name="resourcePackage" value="com.somewhere.mblsvc.resources"/>
    <property name="scan" value="true"/>
</bean>
<!-- end additional working code -->

<bean id="apiDeclarationProvider" class="com.wordnik.swagger.jaxrs.listing.ApiDeclarationProvider" />
<bean id="apiListingResourceJson" class="com.wordnik.swagger.jaxrs.listing.ApiListingResourceJSON" />
<bean id="resourceListingProvider" class="com.wordnik.swagger.jaxrs.listing.ResourceListingProvider" />

My web.xml looks like this: 我的web.xml看起来像这样:

<!-- REST servlet that dispatches to the App (resource class). Remove Init params entry containing application file -->
<servlet>
    <servlet-name>Wink Servlet</servlet-name>
    <servlet-class>org.apache.wink.server.internal.servlet.RestServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Wink Servlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
</servlet-mapping>

<!-- Enabling Swagger servlet -->
<servlet>
    <servlet-name>Swagger Servlet</servlet-name>
    <servlet-class>com.somewhere.mblsvc.web.SwaggerServlet</servlet-class>
    <load-on-startup>-1</load-on-startup> 
</servlet>
<servlet-mapping>
    <servlet-name>Swagger Servlet</servlet-name>
    <url-pattern>/api-docs</url-pattern>
</servlet-mapping>

Here's a snippet of my Resource class: 这是我的Resource类的片段:

@Path("test")
@Api(value ="test", description="Test Services")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public class TestResource {

.
.
.

    @GET
    @Path("testInfo")
    @ApiParam(defaultValue="you would put test case input here for a post")  
    @ApiOperation(value="Composite service returning extensive test information", response=com.somewhere.mblsvc.messages.test.testinfo.pojo.UserResponseMessage.class)
    @ApiResponses(value={
            @ApiResponse(code=200, message="OK"),
            @ApiResponse(code=500, message="Internal Error")
    })
    @JsonSerialize(include=JsonSerialize.Inclusion.ALWAYS)
    public Response getTestInfo(@Context HttpHeaders headers, 
            @CookieParam(value = "testBrand") String testBrand) {
.
.
.

And, finally, the only important part of my index.html (that I can tell) looks like this: 最后,我的index.html唯一重要的部分(我可以告诉)看起来像这样:

  <script type="text/javascript">
    $(function () {
      var url = window.location.search.match(/url=([^&]+)/);
      if (url && url.length > 1) {
        url = url[1];
      } else {
        url = "http://" + window.location.hostname + (window.location.port ? ':'+ window.location.port: '') + "/mbl/services/api-docs";
      }
      .
      .
      .

I will gladly supply any more information as needed. 很乐意根据需要提供更多信息。 Does anyone have any idea what I might be missing? 有谁知道我可能会缺少什么?

Thanks a lot! 非常感谢!

The core problem is that your resources are not really scanned. 核心问题是您的资源并未真正扫描过。 You do get the right now is the basic Swagger response, but if you look at the content, it has no API definitions in it. 你现在得到的是基本的Swagger响应,但是如果你看一下内容,它就没有API定义了。

As a result, swagger-ui is unable to show anything, because there's nothing to show. 结果,swagger-ui无法展示任何东西,因为没有任何东西可以显示。

While I'm curious as to how you got to the configuration above, the truth is that the integration can be simpler. 虽然我很好奇你是如何进行上述配置的,但事实是整合可以更简单。 We don't have specific documentation for Wink (we should), but the idea is very similar to any of the JAX-RS integrations. 我们没有针对Wink的具体文档(我们应该),但这个想法与任何JAX-RS集成非常相似。

I'd recommend the following steps: 我建议采取以下步骤:

  1. Migrate to swagger-core 1.5. 迁移到swagger-core 1.5。 It's obvious this is a new integration and there's no reason not to use it. 很明显,这是一个新的集成,没有理由不使用它。
  2. Check out the wink sample - should be really easy to follow. 看看眨眼样本 - 应该容易理解。
  3. Read the guides for 1.5 - they are not for wink, but they are all similar and you can infer to wink. 阅读1.5的指南 - 它们不是为了眨眼,但它们都很相似,你可以推断为眨眼。
  4. Check the migration guide as it also contains details that may help you out. 请查看迁移指南 ,因为它还包含可能对您有所帮助的详细信息。

I realize this doesn't solve the question at-hand exactly, but I'd rather promote the right overall solution in this case. 我意识到这并不能完全解决问题,但我宁愿在这种情况下推广正确的整体解决方案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM