当前位置: 首页 > 后端技术 > Java

SpringBoot集成Swagger报错:-this.condition-isnull

时间:2023-04-02 09:37:06 Java

前段时间在群里看到有人抱怨swagger集成问题,当时没仔细看,一直以为是姿势不对.这两天正好自己升级了SpringBoot版本,然后突然出现这样的错误:Causedby:java.lang.NullPointerException:Cannotinvoke"org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getPatterns()”因为“this.condition”在springfox.documentation.spring.web.WebMvcPatternsRequestConditionWrapper.getPatterns(WebMvcPatternsRequestConditionWrapper.java:56)~[springfox-spring-webmvc-3.0.0.jar:3.0.0]处为空.documentationler.RequestH.sortedPaths(RequestHandler.java:113)~[springfox-core-3.0.0.jar:3.0.0]在springfox.documentation.spi.service.contexts.Orderings.lambda$byPatternsCondition$3(Orderings.java:89)~[springfox-spi-3.0.0.jar:3.0.0]在java.base/java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:473)~[na:na]在java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)~[na:na]在java.base/java.util.TimSort.sort(TimSort.java:220)~[na:na]在java.base/java.util.Arrays.sort(Arrays.java:1307)~[na:na]在java.base/java.util.ArrayList.sort(ArrayList.java:1721)~[na:na]在java.base/java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:392)~[na:na]在java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258)~[na:na]在java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258)~[na:na]在java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258)~[na:na]在java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258)~[na:na]在java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510)~[na:na]在java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)~[na:na]在java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)~[na:na]在java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)~[na:na]在java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)~[na:na]在springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider.requestHandlers(WebMvcRequestHandlerProvider.java:81)~[springfox-spring-webmvc-3.0.0.jar:3.0.0]在java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)~[na:na]在java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)~[na:na]在java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)~[na:na]在java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)~[na:na]在java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)~[na:na]在java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)~[na:na]在java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)~[na:na]在springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.withDefaults(AbstractDocumentationPluginsBootstrapper.java:107)~[springfox-spring-web-3.0.0.jar:3.0.0]在springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.buildContext(AbstractDocumentationPluginsPluginsBoot9:)~[springfox-spring-web-3.0.0.jar:3.0.0]在springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.bootstrapDocumentationPlugins(AbstractDocumentationPluginsBootstrapper.java:82)~[springfox-spring-web-3.0.0.jar:3.0.0]在springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.start(DocumentationPluginsBootstrapper.java:100)~[springfox-spring-web-3.0.0.jar:3.0.0]在org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178)~[spring-context-5.3.20.jar:5.3.20]...14个常用框架省略查了下,找到一个SpringBoot下的Issue:https://github.com/spring-projects/spring-boot/issues/28794,但这个问题已经关闭。目前主要讨论这个问题的是springfox。具体问题是这个:https://github.com/springfox/springfox/issues/3462关注这个问题看了下,这个问题主要出现在SpringBoot2.6及之后的版本,只要是新的PathPatternParser引起的由SpringBoot2.6引入目前从评论中得处的解决方案是:Path匹配策略切换回ant_path_matcherspring.mvc.pathmatch.matching-strategy=ant_path_matcher添加下面这个Bean的定义@BeanpublicWebMvcEndpointHandlerMappingwebEndpointServletHandlerMapping(WebEndpointsSupplierwebEndpointsSupplier,ServletEndpointsSupplierservletEndpointsSupplier,ControllerEndpointsSuppliercontrollerEndpointsSupplier,EndpointMediaTypesendpointMediaTypes,CorsEndpointPropertiescorsProperties,WebEndpointPropertieswebEndpointProperties,Environmentenvironment){List>allEndpoints=newArrayList();CollectionwebEndpoints=webEndpointsSupplier.getEndpoints();allEndpoints.addAll(webEndpoints);allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());StringbasePath=webEndpointProperties.getBasePath();EndpointMappingendpointMapping=newEndpointMapping(basePath);booleanshouldRegisterLinksMapping=this.shouldRegisterLinksMapping(webEndpointProperties,环境,basePath);返回新的WebMvcEndpointHandlerMapping(endpointMapping,webEndpoints,endpointMediaTypes,corsProperties.toCorsConfiguration(),newEndpointLinksResolver(allEndpoints,basePath),shouldRegisterLinksMapping,null);}privatebooleanshouldRegisterLinksMapping(WebEndpointPropertieswebEndpointProperties,Environmentenvironment,StringbasePath){returnwebEndpointProperties.getDiscovery().isEnabled()&&(StringUtils.hasText(basePath)||ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));}我直接用了第一种方式,添加配置即可。如果您最近也遇到过这个问题,希望这篇文章可以帮到您!