spring clound 项目 @FeignClient 上加 @RequestMapping 注解远程调用报错解决

  • Post author:
  • Post category:其他


问题描述:

公司同事发现在 @FeignClient上配置 @RequestMapping 注解后导致远程调用不通,同时本模块在 swagger上会出现远程调用的接口,但是这个接口其实不应该展示在本模块 swagger接口目录上的。

写法如下:

然后改成下面这种写法就可以调用成功了

然后说@FeignClient 应该是不支持 @RequestMapping 注解,但是我觉得不太应该,我记得在之前项目也用过类似写法,刚刚我比较空闲一点,就想着把这个问题处理了。

解决:

1.  远程调用报错:  org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL was not normalized.

我在本地启动这两个服务,发现调用出现如下错误:

然后网上看了下,这个错误大多出现在URL配置不正确,导致不匹配的情况,然后仔细看了下代码,发现是URL后面多了一个/,改成如下形式就可以成功调用了。

2. swagger  上显示@FeignClient 修饰的接口

多余显示的url如图所示:

原因:在 RequestMappingHandlerMapping 有一个isHandler() 方法,在这个方法上判断了被 @Controller 和  @RequestMapping 注解修饰的类就是一个处理请求的Handler处理类,如下:

protected boolean isHandler(Class<?> beanType) {
        return AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) || AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class);
    }

所以我们只需要重写下这个类就行了。增加下面配置类,把同时又被@FeignClient注解修饰的过滤就可以了。

package com.iunicorn.mall.middle.starter.common.config;

import feign.Feign;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.cloud.openfeign.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;

/**
 * @Title: FeignConfiguration
 * @Description: feign配置
 * @date : 2020/10/14 15:37
 */
@Configuration
@ConditionalOnClass({Feign.class})
public class FeignConfiguration {

    @Bean
    public WebMvcRegistrations feignWebRegistrations() {
        return new WebMvcRegistrations() {
            @Override
            public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
                return new FeignRequestMappingHandlerMapping();
            }
        };
    }

    /**
     * swagger过滤同时被 @FeignClient和@RequestMapping 修饰的类
     */
    private static class FeignRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
        @Override
        protected boolean isHandler(Class<?> beanType) {
            return super.isHandler(beanType) &&
                    !AnnotatedElementUtils.hasAnnotation(beanType, FeignClient.class);
        }
    }
}

参考资料:

https://blog.csdn.net/andy_zhang2007/article/details/90573633


http://blog.didispace.com/spring-cloud-feignclient-problem/?utm_source=tuicool&utm_medium=referral



版权声明:本文为qq_33071429原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。