覆盖bean定义在我看来比我想象的更难。 首先,我想保持开/关原则。
我正在使用Springfox,它将提供基于Spring Mapping的swagger json。 Springfox由我必须提供的Config类加载:
@EnableWebMvc
@Configuration
@Import({Swagger2DocumentationConfiguration.class})
@ComponentScan(basePackages = {"special.package.swagger"})
public class ApplicationSwaggerConfig {
@Bean
public Docket swaggerApi() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("rest-api")
.select()
.build()
.pathMapping("/rest-api");
}
...
当然,我不想改变Swagger2DocumentationConfiguration类(遵循开放/封闭原则)但改变ServiceModelToSwagger2Mapper的行为。
为此,我在“special.package.swagger”文件夹中创建了一个MyServiceModelToSwagger2Mapper类,例如:
@Component
@Primary
public class MyServiceModelToSwagger2Mapper extends ServiceModelToSwagger2MapperImpl {
@Override
public Swagger mapDocumentation(Documentation from) {
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n******************** Override works!!!\n");
return super.mapDocumentation(from);
}
}
Spring加载组件,解决了歧义问题,但是覆盖不起作用。有谁知道为什么!?
编辑:@smarquis评论帮了很多忙。 Spring工作正常。
我不小心添加了多个版本的springfox库。应用程序服务器加载了两个库并丢失了。一旦类路径问题得到解决,覆盖就会完美地运行。
答案 0 :(得分:1)
这是由于构建java配置的spring的方式 - 内部代理和东西变得非常复杂。
我不记得确切的原因,但如果你这样做你的覆盖工作:
@EnableWebMvc
@Configuration
@Import({Swagger2DocumentationConfiguration.class})
//@ComponentScan(basePackages = {"springfoxswagger.specialpackageswagger"})
public class ApplicationSwaggerConfig {
@Bean
public Docket swaggerApi() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("rest-api")
.select()
.build()
.pathMapping("/rest-api");
}
@Bean
public springfox.documentation.swagger2.mappers.ServiceModelToSwagger2Mapper mapper() {
return new ServiceModelToSwagger2MapperImpl() {
public Swagger mapDocumentation(Documentation from) {
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n******************** Override works!!!\n");
return super.mapDocumentation(from);
}
};
}
}
它也更简单,可以说。
编辑
似乎不适用于OP,所以我进一步调查了一下。
请注意,您不需要在bean上使用@Primary注释。
2016-01-26 08:50:26.594 INFO 58548 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 22 ms
********************覆盖工作!!!
添加@BeanNameAware或@AnnotationConfigDriven等“简单”解决方案是行不通的。 IMO OP遇到了Spring Java Config错误或限制;我没有看到他的解决方案无效的任何理由。
答案 1 :(得分:0)
尝试将@AnnotationDrivenConfig
放在您的课堂上并尝试:
@EnableWebMvc
@Configuration
@AnnotationDrivenConfig
@Import({Swagger2DocumentationConfiguration.class})
public class ApplicationSwaggerConfig {
@Bean
public Docket swaggerApi() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("rest-api")
.select()
.build()
.pathMapping("/rest-api");
}
@Bean
@Primary
public MyServiceModelToSwagger2Mapper mapper() {
return new MyServiceModelToSwagger2Mapper();
}
}
MyServiceModelToSwagger2Mapper类:
public class MyServiceModelToSwagger2Mapper extends ServiceModelToSwagger2MapperImpl {
@Override
public Swagger mapDocumentation(Documentation from) {
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n******************** Override works!!!\n");
return super.mapDocumentation(from);
}
}