首页 新闻 会员 周边 捐助

实现RequestInterceptor接口的两个拦截器,其中一个apply方法没有执行

0
悬赏园豆:20 [已解决问题] 解决于 2024-11-27 10:51

已经在config类中,对两个拦截器进行定义了。但是在打断点的时候,TokenInterceptor中重写的apply()方法没有被执行。

@Configuration
@Slf4j
public class FeginConfig {

    @Bean
    @Order(1)
    public TokenInterceptor tokenInterceptor(){
        log.info("TokenInterceptor bean created");
        return new TokenInterceptor();
    }

    @Bean
    @Order(2)
    public MessageInterceptor messageInterceptor(){
        log.info("MessageInterceptor bean created");
        return new MessageInterceptor();
    }

}
package com.hong.robot.interceptor;

import com.hong.robot.pojo.bo.TenantAccessToken;
import com.hong.robot.service.FeiShuApiService;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
public class TokenInterceptor implements RequestInterceptor {

    private String token;

    /**
     * 记录上次更新令牌时间
     */
    private long lastUpdateTime;

    private String tokenExpireTime;

    @Autowired
    private FeiShuApiService feiShuApiService;

    @Autowired
    public TenantAccessToken tenantAccessToken;

    @Value("${app.app_id}")
    private String appId;

    @Value("${app.app_secret}")
    private String appSecret;

    @Value("${app.token_url}")
    private String tokenUrl;

    @PostConstruct
    public void init(){
        // 初始化时获取一次 access_token
        refreshAccessToken();
    }

    /**
     * 该重新接口,每次请求前都会被调用一次,用于检查token
     * @param requestTemplate
     */
    @Override
    public void apply(RequestTemplate requestTemplate) {
        log.info("TokenInterceptor apply method called");
        //第一次获取token,token最新更新时间和过期时间为null,跳过该方法
        if (lastUpdateTime != 0 || tokenExpireTime != null){
            if ((System.currentTimeMillis() - lastUpdateTime) >= Long.parseLong(tokenExpireTime) * 1000) {
                TenantAccessToken tenantAccessToken = this.refreshAccessToken();
                token = tenantAccessToken.getTenantAccessToken();
                log.info("token:" + token);
            }
            requestTemplate.header("Content-Type","application/json; charset=utf-8");
            requestTemplate.header("Authorization", "Bearer " + token);
        }
    }

    //获取token
    private TenantAccessToken refreshAccessToken() {
        // 获取新的 access_token
        Map<String, String> tokenResponse = feiShuApiService.getTenantAccessToken(appId,appSecret);
        TenantAccessToken tenantAccessToken = new TenantAccessToken();
        tenantAccessToken.setCode(tokenResponse.get("code"));
        tenantAccessToken.setExpire(tokenResponse.get("expire"));
        tenantAccessToken.setTenantAccessToken(tokenResponse.get("tenant_access_token"));
        tenantAccessToken.setMsg(tokenResponse.get("msg"));
        this.tokenExpireTime = tokenResponse.get("expire");
        this.token = tokenResponse.get("tenant_access_token");
        this.lastUpdateTime = System.currentTimeMillis();
        return tenantAccessToken;
    }
}

yanhongwen的主页 yanhongwen | 初学一级 | 园豆:181
提问于:2024-11-21 15:59
< >
分享
最佳答案
0

原因:
通过@Autowired注解注入的 feiShuApiService 类使用了 @FeignClient 注解,以及 @Value 注解,这些会导致不执行 apply方法。具体原因不明。

解决办法:
删除以上注入的类和属性,寻找其他方法代替。

yanhongwen | 初学一级 |园豆:181 | 2024-11-27 10:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册