2014-04-17 8 views
6

Ich erstelle gerade einen API-Rest mit Eclipse, Spring Framework MVC, und ich habe gerade meinen Projekt-Swagger hinzugefügt. Ich kann auf das json-Ergebnis von swagger zugreifen, aber ich muss swagger ui hinzufügen.Ich kann Swagger-ui nicht mit meinem Swagger-Projekt verknüpfen Spring mvc project

Hier sind alle meine Dateien erstellen für Prahlerei-springmvc:

WebAppInitializer.java

public class WebAppInitializer implements WebApplicationInitializer { 

    private AnnotationConfigWebApplicationContext ctx = null; 

    @Override 
    public void onStartup(final ServletContext sc) throws ServletException { 

     System.setProperty("spring.profiles.active", "web"); 

     // Create the 'root' Spring application context 
     ctx = new AnnotationConfigWebApplicationContext(); 
     ctx.register(SpringBaseWebConfiguration.class, 
       SpringSwaggerConfiguration.class); 

     // Manages the lifecycle 
     sc.addListener(new ContextLoaderListener(ctx)); 
     sc.addListener(new ContextCleanupListener()); 

     // Spring WebMVC 
     ServletRegistration.Dynamic springWebMvc = sc.addServlet("ws", 
       new DispatcherServlet(ctx)); 
     springWebMvc.setLoadOnStartup(1); 
     springWebMvc.addMapping("/ws/*"); 
     springWebMvc.setAsyncSupported(true); 
    } 

    @PreDestroy 
    protected final void cleanup() { 
     if (ctx != null) { 
      ctx.close(); 
     } 
    } 
} 

SpringSwaggerConfiguration.java

public class SpringSwaggerConfiguration { 
    public static final List<String> DEFAULT_INCLUDE_PATTERNS = Arrays 
      .asList(new String[]{"/com/sa/rnd/dark/resources/.*"}); 
    public static final String SWAGGER_GROUP = "ApiDark"; 
    public static final String RELATIVE_GROUP = "ApiDark"; 
    @Autowired 
    private SpringSwaggerConfig springSwaggerConfig; 

/** 
* Adds the jackson scala module to the MappingJackson2HttpMessageConverter 
* registered with spring Swagger core models are scala so we need to be 
* able to convert to JSON Also registers some custom serializers needed to 
* transform swagger models to swagger-ui required json format 
*/ 
@Bean 
public JacksonScalaSupport jacksonScalaSupport() { 
    final JacksonScalaSupport jacksonScalaSupport = new JacksonScalaSupport(); 
    // Set to false to disable 
    jacksonScalaSupport.setRegisterScalaModule(true); 
    return jacksonScalaSupport; 
} 

/** 
* Global swagger settings 
*/ 
@Bean 
public SwaggerGlobalSettings swaggerGlobalSettings() { 
    final SwaggerGlobalSettings swaggerGlobalSettings = new SwaggerGlobalSettings(); 
    swaggerGlobalSettings.setGlobalResponseMessages(springSwaggerConfig 
      .defaultResponseMessages()); 
    swaggerGlobalSettings.setIgnorableParameterTypes(springSwaggerConfig 
      .defaultIgnorableParameterTypes()); 
    return swaggerGlobalSettings; 
} 

/** 
* API Info as it appears on the swagger-ui page 
*/ 
private ApiInfo apiInfo() { 
    return new ApiInfo(
      "Swagger Spring MVC for Dark Api", 
      "Sample application demonstrating how to use swagger-springmvc in a no-XML environment.", 
      "http://en.wikipedia.org/wiki/Terms_of_service", 
      "[email protected]", "Apache 2.0", 
      "http://www.apache.org/licenses/LICENSE-2.0.html"); 
} 

/** 
* Configure a SwaggerApiResourceListing for each swagger instance within 
* your app. e.g. 1. private 2. external apis Required to be a spring bean 
* as spring will call the postConstruct method to bootstrap swagger 
* scanning. 
* 
* @return 
*/ 
@Bean 
public SwaggerApiResourceListing swaggerApiResourceListing() { 
    // The group name is important and should match the group set on 
    // ApiListingReferenceScanner 
    // Note that swaggerCache() is by DefaultSwaggerController to serve the 
    // swagger json 
    final SwaggerApiResourceListing swaggerApiResourceListing = new SwaggerApiResourceListing(
      springSwaggerConfig.swaggerCache(), SWAGGER_GROUP); 

    // Set the required swagger settings 
    swaggerApiResourceListing 
      .setSwaggerGlobalSettings(swaggerGlobalSettings()); 

    // Supply the API Info as it should appear on swagger-ui web page 
    swaggerApiResourceListing.setApiInfo(apiInfo()); 

    // Use the default path provider 
    swaggerApiResourceListing.setSwaggerPathProvider(springSwaggerConfig 
      .defaultSwaggerPathProvider()); 

    // Global authorization - see the swagger documentation 
    swaggerApiResourceListing.setAuthorizationTypes(authorizationTypes()); 

    // Sets up an auth context - i.e. which controller request paths to 
    // apply global auth to 
    swaggerApiResourceListing 
      .setAuthorizationContext(authorizationContext()); 

    // Every SwaggerApiResourceListing needs an ApiListingReferenceScanner 
    // to scan the spring request mappings 
    swaggerApiResourceListing 
      .setApiListingReferenceScanner(apiListingReferenceScanner()); 
    return swaggerApiResourceListing; 
} 

@Bean 
/** 
* The ApiListingReferenceScanner does most of the work. 
* Scans the appropriate spring RequestMappingHandlerMappings 
* Applies the correct absolute paths to the generated swagger resources 
*/ 
public ApiListingReferenceScanner apiListingReferenceScanner() { 
    ApiListingReferenceScanner apiListingReferenceScanner = new ApiListingReferenceScanner(); 

    // Picks up all of the registered spring RequestMappingHandlerMappings 
    // for 
    // scanning 
    apiListingReferenceScanner 
      .setRequestMappingHandlerMapping(springSwaggerConfig 
        .swaggerRequestMappingHandlerMappings()); 

    // Excludes any controllers with the supplied annotations 
    apiListingReferenceScanner.setExcludeAnnotations(springSwaggerConfig 
      .defaultExcludeAnnotations()); 

    // 
    apiListingReferenceScanner 
      .setResourceGroupingStrategy(springSwaggerConfig 
        .defaultResourceGroupingStrategy()); 

    // Path provider used to generate the appropriate uri's 
    apiListingReferenceScanner 
      .setSwaggerPathProvider(relativeSwaggerPathProvider()); 

    // Must match the swagger group set on the SwaggerApiResourceListing 
    apiListingReferenceScanner.setSwaggerGroup(SWAGGER_GROUP); 

    // Only include paths that match the supplied regular expressions 
    apiListingReferenceScanner.setIncludePatterns(DEFAULT_INCLUDE_PATTERNS); 

    return apiListingReferenceScanner; 
} 

private List<AuthorizationType> authorizationTypes() { 
    final List<AuthorizationType> authorizationTypes = new ArrayList<>(); 
    authorizationTypes.add(new BasicAuth()); 
    return authorizationTypes; 
} 

@Bean 
public AuthorizationContext authorizationContext() { 
    final List<Authorization> authorizations = newArrayList(); 

    AuthorizationScope authorizationScope = new AuthorizationScope(
      "global", "accessEverything"); 

    AuthorizationScope[] authorizationScopes = new AuthorizationScope[]{authorizationScope}; 
    authorizations.add(new Authorization("basic", authorizationScopes)); 

    AuthorizationContext authorizationContext = new AuthorizationContext.AuthorizationContextBuilder(
      authorizations).withIncludePatterns(DEFAULT_INCLUDE_PATTERNS) 
      .build(); 

    return authorizationContext; 
} 

// Relative path example 
@Bean 
public SwaggerApiResourceListing relativeSwaggerApiResourceListing() { 
    SwaggerApiResourceListing swaggerApiResourceListing = new SwaggerApiResourceListing(
      springSwaggerConfig.swaggerCache(), RELATIVE_GROUP); 
    swaggerApiResourceListing 
      .setSwaggerGlobalSettings(swaggerGlobalSettings()); 
    swaggerApiResourceListing 
      .setSwaggerPathProvider(relativeSwaggerPathProvider()); 
    swaggerApiResourceListing 
      .setApiListingReferenceScanner(relativeApiListingReferenceScanner()); 
    return swaggerApiResourceListing; 
} 

@Bean 
public ApiListingReferenceScanner relativeApiListingReferenceScanner() { 

    ApiListingReferenceScanner apiListingReferenceScanner = 
      new ApiListingReferenceScanner(); 

    apiListingReferenceScanner 
      .setRequestMappingHandlerMapping(springSwaggerConfig 
        .swaggerRequestMappingHandlerMappings()); 

    apiListingReferenceScanner.setExcludeAnnotations(springSwaggerConfig 
      .defaultExcludeAnnotations()); 

    apiListingReferenceScanner 
      .setResourceGroupingStrategy(springSwaggerConfig 
        .defaultResourceGroupingStrategy()); 

    apiListingReferenceScanner 
      .setSwaggerPathProvider(relativeSwaggerPathProvider()); 

    apiListingReferenceScanner.setSwaggerGroup(RELATIVE_GROUP); 
    apiListingReferenceScanner.setIncludePatterns(DEFAULT_INCLUDE_PATTERNS); 
    return apiListingReferenceScanner; 
} 

@Bean 
public SwaggerPathProvider relativeSwaggerPathProvider() { 
    return new ApiRelativeSwaggerPathProvider(); 
} 

private class ApiRelativeSwaggerPathProvider extends 
     DefaultSwaggerPathProvider { 
    @Override 
    public String getAppBasePath() { 
     return "/ApiDark/ws"; 
    } 
} 

}

SpringBaseWebConfiguration.java:

@Configuration 
@ComponentScan(basePackages = {"com.sa.rnd.dark.resources", 
     "com.mangofactory.swagger.configuration", 
     "com.mangofactory.swagger.controllers"}) 

@EnableWebMvc 
public class SpringBaseWebConfiguration extends WebMvcConfigurerAdapter { 
    private List<HttpMessageConverter<?>> messageConverters; 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/**").addResourceLocations("/"); 
    } 

    @Override 
    public void addViewControllers(ViewControllerRegistry registry) { 
     registry.addViewController("/api-docs").setViewName("redirect:index.html"); 
    } 

    /** 
    * The message converters for the content types we support. 
    * 
    * @return the message converters; returns the same list on subsequent calls 
    */ 
    private List<HttpMessageConverter<?>> getMessageConverters() { 
     if (messageConverters == null) { 
      messageConverters = new ArrayList<>(); 

      final MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter = new MappingJackson2HttpMessageConverter(); 
      final ObjectMapper mapper = new ObjectMapper(); 
      mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
      mapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT); 
      mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, 
        false); 
      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, 
        false); 
      mappingJacksonHttpMessageConverter.setObjectMapper(mapper); 
      messageConverters.add(mappingJacksonHttpMessageConverter); 
     } 
     return messageConverters; 
    } 

    @Override 
    public void configureMessageConverters(
      List<HttpMessageConverter<?>> converters) { 
     converters.addAll(getMessageConverters()); 
    } 

    @Bean 
    public static PropertyPlaceholderConfigurer swaggerProperties() { 
     final PropertyPlaceholderConfigurer swaggerProperties = new PropertyPlaceholderConfigurer(); 
     swaggerProperties.setLocation(new ClassPathResource(
       "swagger.properties")); 
     return swaggerProperties; 
    } 
} 

Hier sind meine drei Dateien Prahlerei zu meinem Projekt hinzuzufügen, atm ich entscheiden, nur gerade 1-Methode zu überprüfen, welche ist:

@Api(description = "CRUD services for containers working with WebDark", 
     value = "CRUD Services Containers") 
@RestController 
@RequestMapping(value = "/container", produces = MediaType.APPLICATION_JSON_VALUE) 
public class ContainersResources { 
    /** 
    * Find all children of a container. 
    * 
    * @param containerId 
    *   ID of the parent container 
    * @return ApiResponse 
    */ 


    @ApiOperation(response = ApiResponse.class, 
      value = "Find all children containers of one container", 
      notes = "Find all children containers of one container") 
    @RequestMapping(method = RequestMethod.GET, value = "/{containerId}") 
    @ResponseStatus(HttpStatus.OK) 
    public @ResponseBody ApiResponse<List<ContainerModel>> getContainerChildren(
      @ApiParam(required = true, value = "The id of the container parent", 
        name = "containerId")@PathVariable("containerId") final String containerId) { 
     ApiResponse<List<ContainerModel>> result = new ApiResponse<>(); 
     result.setMessage("getContainerChildren method of new Api Dark"); 
     result.setSuccess(true); 
     result.setTotal(9000); 
     return result; 
    } 
} 

Meine Ergebnisse: I die folgende URL http://localhost:8080/ApiDark/ws/api-docs zugreifen können, aber ich erhalte der json Wert wie:

{ "APIVERSION": "1", "swaggerVersion": "1.2", "Berechtigungen": { "BasicAuth": { "type": "BasicAuth"}}, "info ": {" title ":" Swagger Spring MVC für Dark Api "," description ":" Beispielanwendung zeigt, wie man swagger-springmvc in einer XML-Umgebung verwendet. " "TermsOfServiceUrl":" http://en.wikipedia.org/wiki/Terms_of_service " "Kontakt": "[email protected]", "Lizenz": "Apache 2.0", "licenseUrl":" http://www.apache.org/licenses/LICENSE-2.0.html „}}

Deshalb habe ich beschlossen, swagger-ui hinzufügen. Ich füge den Inhalt des Verzeichnisses dist (von swagger-ui) zu meinem Ordner src/main/webapp hinzu. Und ändern Sie den Inhalt von index.html meine URL zu verweisen:

<script type="text/javascript"> 
$(function() { 
    window.swaggerUi = new SwaggerUi({ 
     url: "http://localhost:8080/ApiDark/ws/api-docs.json", 
    dom_id: "swagger-ui-container", 

Aber ich kann nicht Prahlerei-ui-Schnittstelle zugreifen, ich habe nur das json Ergebnis ... Brauchen Sie Hilfe, um es darauf arbeiten!

+0

Sie haben Ihre Antwort auch hier erklärt: http://stackoverflow.com/questions/26807791/integrating-swagger-in-spring-mvc – spiderman

Antwort

0

Was meinen Sie mit 'Ich kann nicht auf Swagger-Ui-Schnittstelle zugreifen'?

In meinem Fall hat mein Browser die index.html (ich glaube es throw 404) nicht geladen, die ich in einem Unterordner zusammen mit allen dist-Dateien hatte: webapp/doc/index.html. Ich hatte den Ordner aus der Servletzuordnung in web.xml auszuschließen, wie ich hier kurz beschrieben: Java swagger with JaxRS throwing errors

Mein web.xml Snippet wie folgt aussieht schließlich:

<servlet-mapping> 
<servlet-name>My application servlet-name</servlet-name> 
<url-pattern>/*</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
<servlet-name>default</servlet-name> 
<url-pattern>/doc/*</url-pattern> 
</servlet-mapping> 

(warum diese Werke hier zu sehen: http://blog.ericdaugherty.com/2010/02/excluding-content-from-url-pattern-in.html)

Hoffe, dass hilft!

+0

Danke, aber ich fand ein Work-around durch die web.xml Umleitung zum swagger index.html;) – Tekateyy

3

Dieses Problem scheint alt, aber nur zu teilen, mit der jüngsten Version von Prahlerei-springmvc und springmvc-ui, es hat mich sehr einfach und weniger kompliziert Prahlerei & Prahlerei-ui mit Ihrem Web-Service zur Integration in Produktions REST zu sehen api Dokumentation.

@EnableSwagger Anmerkung hinzugefügt, die Swagger-Springmvc aus der Box ermöglicht. Auf das generierte press-json Resource Listing kann unter/api-docs zugegriffen werden.

Sie können den folgenden Link für die Schritte zur Integration von Swagger-Springmvc und Swagger-Ui mit Ihrem Federmvc-Projekt beziehen. https://github.com/martypitt/swagger-springmvc

+0

Obwohl ich @EnableSwagger verwende, sehe ich das gleiche Problem. – plzdontkillme

+0

beziehen Sie sich bitte auf diese: http://stackoverflow.com/questions/26807791/integrating-swagger-in-spring-mvc – spiderman

Verwandte Themen