Luoml's blog

Feign与Swagger1集成注入失败问题

最近在做微服务开发,项目中使用spring boot, eureka, feign, hystrix, swagger1等,结果在项目启动时,发现feignclient总是注入失败,抛出空指针异常:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Caused by: java.lang.NullPointerException: null
at com.mangofactory.swagger.models.property.field.FieldModelPropertyProvider.propertiesForSerialization(FieldModelPropertyProvider.java:54) ~[swagger-models-1.0.2.jar:1.0.2]
at com.mangofactory.swagger.models.property.provider.DefaultModelPropertiesProvider.propertiesForSerialization(DefaultModelPropertiesProvider.java:34) ~[swagger-models-1.0.2.jar:1.0.2]
at com.mangofactory.swagger.models.DefaultModelProvider.properties(DefaultModelProvider.java:104) ~[swagger-models-1.0.2.jar:1.0.2]
at com.mangofactory.swagger.models.DefaultModelProvider.modelFor(DefaultModelProvider.java:54) ~[swagger-models-1.0.2.jar:1.0.2]
at com.mangofactory.swagger.readers.ApiModelReader.execute(ApiModelReader.java:71) ~[swagger-springmvc-1.0.2.jar:1.0.2]
at com.mangofactory.swagger.readers.ApiModelReader.execute(ApiModelReader.java:39) ~[swagger-springmvc-1.0.2.jar:1.0.2]
at com.mangofactory.swagger.core.CommandExecutor.execute(CommandExecutor.java:13) ~[swagger-springmvc-1.0.2.jar:1.0.2]
at com.mangofactory.swagger.scanners.ApiListingScanner.scan(ApiListingScanner.java:100) ~[swagger-springmvc-1.0.2.jar:1.0.2]
at com.mangofactory.swagger.core.SwaggerApiResourceListing.initialize(SwaggerApiResourceListing.java:72) ~[swagger-springmvc-1.0.2.jar:1.0.2]
at com.mangofactory.swagger.plugin.SwaggerSpringMvcPlugin.initialize(SwaggerSpringMvcPlugin.java:427) ~[swagger-springmvc-1.0.2.jar:1.0.2]
at com.mangofactory.swagger.plugin.SwaggerPluginAdapter.onApplicationEvent(SwaggerPluginAdapter.java:51) ~[swagger-springmvc-1.0.2.jar:1.0.2]
at com.mangofactory.swagger.plugin.SwaggerPluginAdapter.onApplicationEvent(SwaggerPluginAdapter.java:21) ~[swagger-springmvc-1.0.2.jar:1.0.2]
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:166) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:138) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:382) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:388) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:336) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:877) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:544) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.cloud.context.named.NamedContextFactory.createContext(NamedContextFactory.java:110) ~[spring-cloud-context-1.1.1.RELEASE.jar:1.1.1.RELEASE]
at org.springframework.cloud.context.named.NamedContextFactory.getContext(NamedContextFactory.java:79) ~[spring-cloud-context-1.1.1.RELEASE.jar:1.1.1.RELEASE]
at org.springframework.cloud.context.named.NamedContextFactory.getInstance(NamedContextFactory.java:115) ~[spring-cloud-context-1.1.1.RELEASE.jar:1.1.1.RELEASE]
at org.springframework.cloud.netflix.feign.FeignClientFactoryBean.getOptional(FeignClientFactoryBean.java:148) ~[spring-cloud-netflix-core-1.1.5.RELEASE.jar:1.1.5.RELEASE]
at org.springframework.cloud.netflix.feign.FeignClientFactoryBean.feign(FeignClientFactoryBean.java:93) ~[spring-cloud-netflix-core-1.1.5.RELEASE.jar:1.1.5.RELEASE]
at org.springframework.cloud.netflix.feign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:166) ~[spring-cloud-netflix-core-1.1.5.RELEASE.jar:1.1.5.RELEASE]
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
... 47 common frames omitted

解决办法,在配置swagger时,增加springSwaggerConfig.jacksonSwaggerSupport();具体如下:

1
2
3
4
5
6
7
@Autowired
public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig) {
this.springSwaggerConfig = springSwaggerConfig;

//fix java.lang.NullPointerException com.mangofactory.swagger.models.property.field.FieldModelPropertyProvider.propertiesForSerialization
springSwaggerConfig.jacksonSwaggerSupport();
}

参考:
https://segmentfault.com/a/1190000006595187
https://github.com/spring-cloud/spring-cloud-consul/issues/121

当然,升级成swagger2同样可以解决此问题。

Fork me on GitHub