最近在使用Feign組合微服務的時候發現在@FeignClient接口類上使用@ReqestMapping無效。
像下面的這個代碼:
@FeignClient("xxx")
@RequestMapping("/owner")
public interface OwnerApi{
@RequestMapping("/insert")
public Result add(@RequestBody AzpOwner bean);
@RequestMapping("/delete")
public Result delete(Long id);
@RequestMapping("/update")
public Result update(@RequestBody AzpOwner bean);
@RequestMapping("/findById")
public Result find(Long id);
}
當我們啟動服務並調用生產者的時候,報如下的錯誤:

我一直以為是我的代碼有問題,最后發現是SpringMVC和Feign在加載RequestMapping沖突的原因(參考:http://blog.didispace.com/spring-cloud-feignclient-problem/?utm_source=tuicool&utm_medium=referral)
解決方案就是修改SpringMVC的配置讓他不映射帶有@FeignClient注解的路徑,配置類如下:
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.web.WebMvcRegistrations; import org.springframework.boot.autoconfigure.web.WebMvcRegistrationsAdapter; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import feign.Feign; @Configuration @ConditionalOnClass({Feign.class}) public class FeignConfiguration { @Bean public WebMvcRegistrations feignWebRegistrations() { return new WebMvcRegistrationsAdapter() { @Override public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { return new FeignRequestMappingHandlerMapping(); } }; } private static class FeignRequestMappingHandlerMapping extends RequestMappingHandlerMapping { @Override protected boolean isHandler(Class<?> beanType) { return super.isHandler(beanType) && !AnnotatedElementUtils.hasAnnotation(beanType, FeignClient.class); } } }
需要注意的小細節是該類需要放到@Application的子包下才能被掃描生效
