2

Ich habe eigene RequestMappingHandlerMapping und ich benutze Springfox-Swagger-Ui. Nachdem ich mein benutzerdefiniertes Mapping hinzugefügt habe, kann ich unter http://localhost:8080/swagger-ui.html keinen Swagger mehr erreichen. Irgendwelche Ideen?Spring Boot & Swagger 2 UI & benutzerdefinierte Anforderungsmappinghandlermapping - Mapping Problem

Dies ist meine Konfiguration.

@Configuration 
     public class WebMvcConfig extends WebMvcConfigurationSupport { 
    @Override 
    @Bean 
    public RequestMappingHandlerMapping requestMappingHandlerMapping() { 
     return new ApiVersionRequestMappingHandlerMapping("v"); 
    } 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry 
      .addResourceHandler("/webjars/**") 
      .addResourceLocations("(META-INF/resources/webjars"); 
    } 
} 

Hier ist meine pom.xml:

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.hateoas</groupId> 
     <artifactId>spring-hateoas</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>io.springfox</groupId> 
     <artifactId>springfox-swagger-ui</artifactId> 
     <version>2.4.0</version> 
    </dependency> 
    <dependency> 
     <groupId>io.springfox</groupId> 
     <artifactId>springfox-swagger2</artifactId> 
     <version>2.4.0</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.inject</groupId> 
     <artifactId>javax.inject</artifactId> 
     <version>1</version> 
    </dependency> 

Antwort

-2

ich es endlich gefunden! Die richtige Konfiguration ist dies:

@Configuration 
public class VersioningMappingHandlerConfig { 

    @Bean 
    public ApiVersionRequestMappingHandlerMapping customMappingHandlerMapping() { 
     ApiVersionRequestMappingHandlerMapping handler = new ApiVersionRequestMappingHandlerMapping("v", 1, 1); 
     handler.setOrder(-1); 
     return handler; 
    } 

} 

Hinweis: Es gibt keine extends WebMvcConfigurationSupport und Bohnen Name ist customMappingHandlerMapping

+1

Eigentlich ist das nicht korrekt. Wenn Sie meine Antwort (die vollständige Geschichte meiner Antwort) sehen, werden Sie sehen, dass dies genau der Code ist, den ich als erste Idee vorgeschlagen habe, aber ich habe dann erklärt, warum das nicht funktioniert. Dies registriert nur ein anderes HandlerMapping vor der Standard-Handler-Zuordnung.Sobald Sie eine Web-Methode mit dem gleichen @RequestMapping, aber verschiedenen Versionen verwenden, erhalten Sie einen Fehler für "mehrdeutiges Mapping". –

3

Wenn Sie WebMvcConfigurationSupport außer Kraft setzen, sind Sie auch mvc Autokonfiguration (WebMvcAutoConfiguration) Feder-Boot oberstes. Daher werden Ressourcen, die Spring Boot-Konfiguration benötigen, nicht funktionieren. Dies ist kein spezielles Problem für Swagger.

können Sie diese weitere Informationen über finden Sie hier:

https://github.com/spring-projects/spring-boot/issues/5004

Da die Github Frage schon sagt, wird es auf diese sein, Änderungen in der Zukunft zu erleichtern. Momentan gibt es einige Problemumgehungen, wie dort vorgeschlagen.

Eine schnelle und schmutzige Art und Weise, dies zu tun durch das Kopieren und die WebMvcAutoConfiguration Klasse in Ihre eigene Klasse einfügen, Ihr eigenes HandlerMapping vom requestMappingHandlerMapping Rückkehr() -Methode von EnableWebMvcConfiguration und die Kopie der WebMvcAutoConfiguration als Autokonfigurationsklasse Registrierung. Eine Anleitung finden Sie hier:

http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html

Stellen Sie sicher, Ihre Kopie des WebMvcAutoConfiguration irgend Paket zu platzieren, die nicht automatisch Komponente gescannten und abgeholt wird. Es sollte nur wie im obigen Link erklärt registriert werden.

Auch stellen Sie sicher, dass die Reihenfolge der Sie benutzerdefinierte HandlerMapping auf 0, bevor es aus dem requestMappingHandlerMapping() -Methode, wie so Rückkehr gesetzt:

@Bean 
@Primary 
@Override 
public RequestMappingHandlerMapping requestMappingHandlerMapping() { 
    // Must be @Primary for MvcUriComponentsBuilder to work 

    ApiVersionRequestMappingHandlerMapping handlerMapping = new ApiVersionRequestMappingHandlerMapping("v"); 
    handlerMapping.setOrder(0); 
    handlerMapping.setInterceptors(getInterceptors()); 
    handlerMapping.setContentNegotiationManager(mvcContentNegotiationManager()); 

    PathMatchConfigurer configurer = getPathMatchConfigurer(); 
    if (configurer.isUseSuffixPatternMatch() != null) { 
     handlerMapping.setUseSuffixPatternMatch(configurer.isUseSuffixPatternMatch()); 
    } 
    if (configurer.isUseRegisteredSuffixPatternMatch() != null) { 
     handlerMapping.setUseRegisteredSuffixPatternMatch(configurer.isUseRegisteredSuffixPatternMatch()); 
    } 
    if (configurer.isUseTrailingSlashMatch() != null) { 
     handlerMapping.setUseTrailingSlashMatch(configurer.isUseTrailingSlashMatch()); 
    } 
    if (configurer.getPathMatcher() != null) { 
     handlerMapping.setPathMatcher(configurer.getPathMatcher()); 
    } 
    if (configurer.getUrlPathHelper() != null) { 
     handlerMapping.setUrlPathHelper(configurer.getUrlPathHelper()); 
    } 

    return handlerMapping; 
} 
1

Es funktioniert für me.Overriding addResourceHandlers statt Auto-Konfiguration der Registrierung.

@Configuration 
@EnableWebMvc 
@EnableSwagger2 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
      registry 
      .addResourceHandler("swagger-ui.html") 
      .addResourceLocations("classpath:/META-INF/resources/"); 
      registry 
      .addResourceHandler("/webjars/**") 
      .addResourceLocations("classpath:/META-INF/resources/webjars/") 
    } 
} 
+0

Wenn Sie 'DelegatingWebMvcConfiguration' erweitern, rufen Sie auch' super.addResourceHandlers (registry); 'auf. –

1

Aufschalten requestMappingHandlerMapping() von WebMvcConfigurationSupport wird Federstiefel automatische Konfiguration deaktivieren. Zum Hinzufügen von benutzerdefinierten MVC-Komponenten können Sie WebMvcRegistrations verwenden. Für die Bereitstellung von benutzerdefiniertem RequestMappingHandlerMapping können wir getRequestMappingHandlerMapping() mit benutzerdefiniertem RequestMappingHandlerMapping von WebMvcRegistrationsAdapter überschreiben und es über webMvcRegistrationsHandlerMapping() bereitstellen. Wie,

@Configuration 
class CustomRequestMappingHandlerMapping { 

    @Bean 
    public WebMvcRegistrationsAdapter webMvcRegistrationsHandlerMapping() { 
     return new WebMvcRegistrationsAdapter() { 
      @Override 
      public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { 
       return new ApiVersionRequestMappingHandlerMapping("v"); 
      } 
     }; 
    } 
} 
Verwandte Themen