zoukankan      html  css  js  c++  java
  • feign的callback设定后,项目启动错误

    错误如下:

    Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
    2018-06-16 22:20:47.295 [main] ERROR org.springframework.boot.SpringApplication - Application startup failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'com.newtouch.springcloud.iclient.IUser' method 
    public abstract java.util.Map<java.lang.String, java.lang.Object> com.newtouch.springcloud.iclient.IUser.addUser()
    to {[/user/addUser],methods=[POST]}: There is already 'userFollBack' bean method
    public java.util.Map<java.lang.String, java.lang.Object> com.newtouch.springcloud.iclient.UserFollBack.addUser() mapped.
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
        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.newtouch.springcloud.ShopApplication.main(ShopApplication.java:15)
    Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'com.newtouch.springcloud.iclient.IUser' method 
    public abstract java.util.Map<java.lang.String, java.lang.Object> com.newtouch.springcloud.iclient.IUser.addUser()
    to {[/user/addUser],methods=[POST]}: There is already 'userFollBack' bean method
    public java.util.Map<java.lang.String, java.lang.Object> com.newtouch.springcloud.iclient.UserFollBack.addUser() mapped.
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.assertUniqueMethodMapping(AbstractHandlerMethodMapping.java:576)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.register(AbstractHandlerMethodMapping.java:540)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:264)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:250)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:214)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:184)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:127)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
        ... 16 common frames omitted
    @FeignClient(name="SERVICE-USER",fallback=UserFollBack.class)
    @RequestMapping("/user")
    public interface IUser {
    
        @RequestMapping(method=RequestMethod.POST,value="/addUser")
        public Map<String, Object> addUser();
        
    }
    @Component
    public class UserFollBack implements IUser {
        
        
        public Map<String, Object> addUser(){
            Map<String, Object> resultMap = new HashMap<String, Object>();
            resultMap.put("ok","ss");
            return resultMap;
        }
    }

    当服务提供者不可用时,无法通过提供的接口生成service bean,此时就要使用fallback中提供的bean进行服务。
    原先报错是因为HelloService中的端口被绑定到了对应的方法上,也就是/refactor/hello4被占用,此时再生成RefactorHelloServiceFallback 的bean时,就会出现端口已经被占用的错误(先后顺序可能不同,都是这个问题),我把RefactorHelloServiceFallback 中的端口变更(添加@RequestMapping("/fallback"),或者其他变更端口的方法)后就没有问题了。
    重构前不会出错,是因为既没有公用的HelloService,也没有fallback用到的RefactorHelloServiceFallback ,不存在端口重复的问题。

    更改之后启动成功:

    @Component
    public class UserFollBack implements IUser {
        
        @RequestMapping("/fallback")
        public Map<String, Object> addUser(){
            Map<String, Object> resultMap = new HashMap<String, Object>();
            resultMap.put("ok","ss");
            return resultMap;
        }
    }

     requestmappering不要加在类上也是可以的 

    @FeignClient(name="SERVICE-USER",fallback=UserFollBack.class)
    public interface IUser {
    
        @RequestMapping(method=RequestMethod.POST,value="user/addUser")
        public Map<String, Object> addUser();
        
    }
    
    @Component
    class UserFollBack implements IUser {
    
        public Map<String, Object> addUser(){
            Map<String, Object> resultMap = new HashMap<String, Object>();
            resultMap.put("ok","ss");
            return resultMap;
        }
    }
  • 相关阅读:
    Istio安装配置及使用
    Istio介绍
    Rancher管理k8s集群
    EFK部署
    常见日志收集方案及相关组件
    Prometheus Pushgateway
    Prometheus监控拓展
    Prometheus PromQL语法
    开始新工作了
    SpringBlade 新系统 运行
  • 原文地址:https://www.cnblogs.com/zxf330301/p/9191627.html
Copyright © 2011-2022 走看看