錯誤如下:
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; } }