Feign请求参数传递问题解决方案

在 Spring Cloud Feign 中,FeignRequestInterceptor 需要被注册为 Spring 的 Bean 才能生效,但不需要特定的注解标记拦截器本身。以下是详细说明:

1. 拦截器类本身不需要特殊注解

FeignRequestInterceptor 类本身是一个普通的 Java 类,实现 RequestInterceptor 接口即可,不需要添加特定注解:

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

public class FeignRequestInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) 
            RequestContextHolder.getRequestAttributes();
        if (attributes != null) {
            HttpServletRequest request = attributes.getRequest();
            Enumeration<String> paramNames = request.getParameterNames();
            while (paramNames.hasMoreElements()) {
                String name = paramNames.nextElement();
                template.query(name, request.getParameter(name));
            }
        }
    }
}

2. 需要通过配置类注册为 Bean

需要在配置类中将其声明为 Spring Bean(使用 @Bean 注解):

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeignConfig {
    
    @Bean
    public FeignRequestInterceptor feignRequestInterceptor() {
        return new FeignRequestInterceptor();
    }
}

3. 其他注意事项

  1. 自动生效:一旦注册为 Bean,Feign 会自动发现并应用所有 RequestInterceptor 实现

  2. 多拦截器顺序:如果有多个拦截器,可以使用 @Order 注解指定顺序

  3. 作用范围

    • 全局作用:如上配置会对所有 Feign 客户端生效
    • 特定客户端作用:如果想只对特定客户端生效,可以在 @FeignClient 注解中指定配置类
    @FeignClient(name = "service-name", configuration = SpecificFeignConfig.class)
    public interface MyFeignClient {
        // ...
    }
    
  4. 请求上下文依赖:确保你的请求是在 Spring MVC 的 DispatcherServlet 处理的线程中,否则 RequestContextHolder 可能获取不到请求信息

这样配置后,拦截器就会自动生效,无需在其他地方显式引用或调用。

你可能感兴趣的:(Feign请求参数传递问题解决方案)