feign을 사용할 때 공급자가 요청에서 매개변수 값을 얻을 수 없는 경우의 해결 방법

feign을 사용할 때 공급자가 요청에서 매개변수 값을 얻을 수 없는 경우의 해결 방법

질문:

개발 중에 프로젝트 A는 백엔드에서 프로젝트 B의 가상 인터페이스를 호출해야 합니다. 프로젝트 B의 원래 매개변수 수신은 아래와 같이 httpServletRequest에 있습니다.
여기에 이미지 설명을 삽입하세요.
우리는 feign 인터페이스가 HttpServletRequest를 매개변수로 지원하지 않는다는 것을 알고 있으므로 feign 인터페이스는 다음과 같습니다.
여기에 이미지 설명을 삽입하세요.

분석하다:

소비자의 하위 링크에서 가짜 인터페이스가 호출되므로 요청은 상속을 지원하지 않습니다. feign 인터페이스를 호출하면 원래 요청 뒤에 새 요청이 따르지 않으므로 공급자의 요청이 비어 있고 매개변수 값을 얻을 수 없습니다.
여기에 이미지 설명을 삽입하세요.

해결책

요청의 값은 가짜 요청의 http 호출로 수동으로 설정됩니다.

@Configuration
public class OpenFeignConfig implements RequestInterceptor {
    
    

    private static final org.slf4j.Logger _logger = LoggerFactory.getLogger(OpenFeignConfig.class);

    /**
     * NONE(默认):不记录任何日志,性能最佳,适用于生产环境;
     * BASIC:仅记录请求方法、URL、响应状态代码以及执行时间,适用于生产环境追踪问题;
     * HEADERS:在BASIC级别的基础上,记录请求和响应的header;
     * FULL:记录请求和响应的header、body和元数据,适用于开发测试定位问题。
     *
     * @return {@link Logger.Level }
     * @Author wangxiaole
     * @Date 2023/09/07
     **/
    @Bean
    Logger.Level feginLoggerLevel() {
    
    
        return Logger.Level.FULL;
    }

    @Override
    public void apply(RequestTemplate requestTemplate) {
    
    
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        // 传递所有请求头,防止部分丢失
        if (headerNames != null) {
    
    
            while (headerNames.hasMoreElements()) {
    
    
                String name = headerNames.nextElement();
                String values = request.getHeader(name);
                requestTemplate.header(name, values);
            }
        }

    }
}

여기에 이미지 설명을 삽입하세요.

추천

출처blog.csdn.net/weixin_43811057/article/details/132764715