问题发现
springboot
项目集成了swagger2
,项目启动时,偶尔会出现这个问题,然而这是一个幽灵问题,并不是每次都会出现,复现这个问题需要运气,有时候可能会连续出现几次,有时候一周也不出现一次。
启动异常时,报错如下:
[2019-07-26 15:23:34] [main] [ERROR] [org.springframework.boot.SpringApplication:771] Application startup failed
org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.IllegalArgumentException: Multiple entries with same key: springfox.documentation.spring.web.plugins.PathAndParametersEquivalence@5dc9d25a.wrap(springfox.documentation.spring.web.WebMvcRequestHandler@686fb58a)=[springfox.documentation.spring.web.WebMvcRequestHandler@686fb58a] and springfox.documentation.spring.web.plugins.PathAndParametersEquivalence@5dc9d25a.wrap(springfox.documentation.spring.web.WebMvcRequestHandler@2c4be45f)=[springfox.documentation.spring.web.WebMvcRequestHandler@2c4be45f]
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:176)
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:50)
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:350)
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:149)
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:112)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:880)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:146)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:545)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:124)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
at com.test.abc.Application.main(Application.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: java.lang.IllegalArgumentException: Multiple entries with same key: springfox.documentation.spring.web.plugins.PathAndParametersEquivalence@5dc9d25a.wrap(springfox.documentation.spring.web.WebMvcRequestHandler@686fb58a)=[springfox.documentation.spring.web.WebMvcRequestHandler@686fb58a] and springfox.documentation.spring.web.plugins.PathAndParametersEquivalence@5dc9d25a.wrap(springfox.documentation.spring.web.WebMvcRequestHandler@2c4be45f)=[springfox.documentation.spring.web.WebMvcRequestHandler@2c4be45f]
at com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:150)
at com.google.common.collect.RegularImmutableMap.checkNoConflictInBucket(RegularImmutableMap.java:104)
at com.google.common.collect.RegularImmutableMap.<init>(RegularImmutableMap.java:70)
at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:254)
at com.google.common.collect.ImmutableListMultimap.copyOf(ImmutableListMultimap.java:268)
at com.google.common.collect.ImmutableMultimap.copyOf(ImmutableMultimap.java:298)
at com.google.common.collect.ImmutableMultimap$Builder.build(ImmutableMultimap.java:272)
at com.google.common.collect.ImmutableListMultimap$Builder.build(ImmutableListMultimap.java:224)
at com.google.common.collect.Multimaps.index(Multimaps.java:1511)
at com.google.common.collect.Multimaps.index(Multimaps.java:1455)
at springfox.documentation.spring.web.plugins.DefaultRequestHandlerCombiner.combined(DefaultRequestHandlerCombiner.java:59)
at springfox.documentation.spring.web.plugins.DefaultRequestHandlerCombiner.combine(DefaultRequestHandlerCombiner.java:49)
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.defaultContextBuilder(DocumentationPluginsBootstrapper.java:106)
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.buildContext(DocumentationPluginsBootstrapper.java:91)
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.start(DocumentationPluginsBootstrapper.java:154)
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:173)
... 22 common frames omitted
解决方案
因为是个幽灵问题,重启大法一般能解决问题,但是这个问题始终存在,重启并不是解决问题的方法。
搜索这个关键的PathAndParametersEquivalence
类,发现是swagger
相关的类,所以问有可能是swagger
导致的,先是google了一下,然后在github找到了这个issue:Endpoints with the same path and parameters but different headers some times cause java.lang.IllegalArgumentException: Multiple entries with same key #2039,下面的讨论也十分精彩,而且也有人提到了是个幽灵问题,并且使用的swagger版本正是2.7.0
,和我的情况一致,看到issue已经closed,我觉得问题马上能解决了:
作者先是发布了2.7.1-SNAPSHOT
,但是很多人反映问题似乎并没有解决;有人指出了问题所在,作者在随后发布的2.8.0
中修复了这个问题。
因此,直接将swagger升级到2.8.0+
即可测底解决此问题,因为springboot
使用的1.5.21.RELEASE
版本,尝试过将swagger升级到2.9.2
,但会报一些包冲突,不想解决就直接使用2.8.0
了。