最近学习项目,使用到了feign,引用位置代码如下:
@Configuration
@Api(value="用户信息相关controller",tags = {"用户信息相关controller"})
@RequestMapping("user")
@FeignClient(value = MyServiceList.SERVICE_USER)
public interface UserControllerApi {
@ApiOperation(value = "获得用户基本信息",notes = "获得用户基本信息",httpMethod = "POST")
@PostMapping("/getUserInfo")
public GraceJSONResult getUserInfo(@RequestParam String userId);
@ApiOperation(value = "获得用户账户信息",notes = "获得用户账户信息",httpMethod = "POST")
@PostMapping("/getAccountInfo")
public GraceJSONResult getAccountInfo(@RequestParam String userId);
@ApiOperation(value = "修改/完善用户信息",notes = "修改/完善用户信息", httpMethod = "POST")
@PostMapping("/updateUserInfo")
public GraceJSONResult updateUserInfo(@RequestBody @Valid UpdateUserInfoBO updateUserInfoBO,
@RequestParam BindingResult result);
@ApiOperation(value = "根据用户的ids查询用户列表",notes = "根据用户的ids查询用户列表", httpMethod = "GET")
@GetMapping("/queryByIds")
public GraceJSONResult queryByIds(@RequestParam String userIds);
}
启动之后报错:
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
07:40.990 [main] ERROR o.s.boot.SpringApplication - Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'articlePortalController': Unsatisfied dependency expressed through field 'userControllerApi'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.imooc.api.controller.user.UserControllerApi': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1422)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:879)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
at com.imooc.article.Application.main(Application.java:18)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.imooc.api.controller.user.UserControllerApi': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:178)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:101)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1818)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getObjectForBeanInstance(AbstractAutowireCapableBeanFactory.java:1266)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:260)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:1510)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1467)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1250)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640)
... 19 common frames omitted
Caused by: java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0
at feign.Util.checkState(Util.java:129)
at org.springframework.cloud.openfeign.annotation.RequestParamParameterProcessor.processArgument(RequestParamParameterProcessor.java:65)
at org.springframework.cloud.openfeign.support.SpringMvcContract.processAnnotationsOnParameter(SpringMvcContract.java:291)
at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:111)
at org.springframework.cloud.openfeign.support.SpringMvcContract.parseAndValidateMetadata(SpringMvcContract.java:187)
at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:62)
at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.java:151)
at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:49)
at feign.Feign$Builder.target(Feign.java:252)
at org.springframework.cloud.openfeign.HystrixTargeter.target(HystrixTargeter.java:38)
at org.springframework.cloud.openfeign.FeignClientFactoryBean.loadBalance(FeignClientFactoryBean.java:253)
at org.springframework.cloud.openfeign.FeignClientFactoryBean.getTarget(FeignClientFactoryBean.java:282)
at org.springframework.cloud.openfeign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:262)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:171)
... 30 common frames omitted
看了半天百思不得其解,问过大神才知道,Feign调用远程微服务接口的参数中在注解@RequestParam 写法的规定,即@RequestParam注解用来接收字符串类型参数,有以下注意点:
1.客户端@RequestParam注解的value属性必须指定值,不能为空,且要和服务端接口参数名保持一致
2.如果需要传递多个字符串参数,则使用多个@RequestParam注解与服务端接口参数保持一一对应即可
随即修改代码,在@RequestParam后添加value值,如下:
@Configuration
@Api(value="用户信息相关controller",tags = {"用户信息相关controller"})
@RequestMapping("user")
@FeignClient(value = MyServiceList.SERVICE_USER)
public interface UserControllerApi {
@ApiOperation(value = "获得用户基本信息",notes = "获得用户基本信息",httpMethod = "POST")
@PostMapping("/getUserInfo")
public GraceJSONResult getUserInfo(@RequestParam(name="userId") String userId);
@ApiOperation(value = "获得用户账户信息",notes = "获得用户账户信息",httpMethod = "POST")
@PostMapping("/getAccountInfo")
public GraceJSONResult getAccountInfo(@RequestParam(name="userId") String userId);
@ApiOperation(value = "修改/完善用户信息",notes = "修改/完善用户信息", httpMethod = "POST")
@PostMapping("/updateUserInfo")
public GraceJSONResult updateUserInfo(@RequestBody @Valid UpdateUserInfoBO updateUserInfoBO,
@RequestParam(name="result") BindingResult result);
@ApiOperation(value = "根据用户的ids查询用户列表",notes = "根据用户的ids查询用户列表", httpMethod = "GET")
@GetMapping("/queryByIds")
public GraceJSONResult queryByIds(@RequestParam(name="userIds") String userIds);
}
重新启动成功。