SpringCloud @FeignClient的類注解@ReqestMapping無效報錯:No message available","path":"/xxxx


最近在使用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的子包下才能被掃描生效

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM