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

问题描述:

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

      写法如下:

spring clound 项目 @FeignClient 上加 @RequestMapping 注解远程调用报错解决_第1张图片

        然后改成下面这种写法就可以调用成功了 spring clound 项目 @FeignClient 上加 @RequestMapping 注解远程调用报错解决_第2张图片

 

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

解决:

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

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

spring clound 项目 @FeignClient 上加 @RequestMapping 注解远程调用报错解决_第3张图片

 

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

spring clound 项目 @FeignClient 上加 @RequestMapping 注解远程调用报错解决_第4张图片

 

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

      多余显示的url如图所示:

spring clound 项目 @FeignClient 上加 @RequestMapping 注解远程调用报错解决_第5张图片

原因:在 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

你可能感兴趣的:(项目中趟的坑,spring,java,spring,boot,后端)