废话少说,上异常。
此问题出现在升级springboot至3.x的过程中。
一、报错信息
IllegalStateException: PathVariable annotation was empty on param 0
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.wdy.wb.feign.RemoteUniversityFeign': FactoryBean threw exception on object creation
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:188)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:124)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1850)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getObjectForBeanInstance(AbstractAutowireCapableBeanFactory.java:1276)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:336)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1443)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1353)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:598)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:576)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:738)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:270)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:145)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:368)
... 47 common frames omitted
Caused by: java.lang.IllegalStateException: PathVariable annotation was empty on param 0.
at feign.Util.checkState(Util.java:140)
at org.springframework.cloud.openfeign.annotation.PathVariableParameterProcessor.processArgument(PathVariableParameterProcessor.java:52)
at org.springframework.cloud.openfeign.support.SpringMvcContract.processAnnotationsOnParameter(SpringMvcContract.java:298)
at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:126)
at org.springframework.cloud.openfeign.support.SpringMvcContract.parseAndValidateMetadata(SpringMvcContract.java:197)
at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:65)
at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.java:137)
at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:56)
at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:48)
at feign.Feign$Builder.target(Feign.java:201)
at org.springframework.cloud.openfeign.DefaultTargeter.target(DefaultTargeter.java:30)
at org.springframework.cloud.openfeign.FeignClientFactoryBean.loadBalance(FeignClientFactoryBean.java:429)
at org.springframework.cloud.openfeign.FeignClientFactoryBean.getTarget(FeignClientFactoryBean.java:477)
at org.springframework.cloud.openfeign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:452)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:182)
... 61 common frames omitted
二、异常排查
从上述报错第一行可以看到RemoteUniversityFeign文件有异常,且第二个Caused by里提到PathVariable
,故查该文件代码,发现@PathVariable注解中没有指定value属性值,如下:
public interface RemoteUniversityFeign {
/**
* 根据用户id查询发布通知数量
* @param userId 用户ID
* @return 发布通知数量
*/
@GetMapping("/getNtcNumber/{userId}")
R<Integer> getNtcNumber(@PathVariable String userId);
}
分析:本次feign升级为4.1.1之后,上述代码才出现问题,之前版本的feign是无此异常提示的。
之前feign版本如下:
现在feign版本如下:
三、异常解决
问题既然已经有了思路,故加上value属性,再尝试,改后,如下:
public interface RemoteUniversityFeign {
/**
* 根据用户id查询发布通知数量
* @param userId 用户ID
* @return 发布通知数量
*/
@GetMapping("/getNtcNumber/{userId}")
R<Integer> getNtcNumber(@PathVariable(value = "userId") String userId);
}
启动后,此问题消失,此问题得以解决。