已经在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;
}
}
原因:
通过@Autowired注解注入的 feiShuApiService 类使用了 @FeignClient 注解,以及 @Value 注解,这些会导致不执行 apply方法。具体原因不明。
解决办法:
删除以上注入的类和属性,寻找其他方法代替。