1. 程式人生 > >feign的callback設定後,項目啟動錯誤

feign的callback設定後,項目啟動錯誤

doget bject starting servle eba tor exceptio hello IT

錯誤如下:

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;
    }
}

feign的callback設定後,項目啟動錯誤