spring - 构造函数中的 CacheBuilder 初始化不使用 Spring 注释值
问题描述
我正在开发一种适用于谷歌 reCaptcha 的功能。在测试期间,CacheBuilder 出现问题:expireAfterWrite 值始终设置为 = 0(在 anntoation 和 application-test.properities 中也声明了 14400)。因为我认为有些地方是错误的,因为它是在构造函数中初始化的。有没有其他方法来初始化它?
public class RecaptchaService {
private final Logger log = LoggerFactory.getLogger(this.getClass());
private final RestTemplate restTemplate;
@Value("${recaptcha.url:}")
private String recaptchaUrl;
@Value("${recaptcha.secret:#{null}}")
private String recaptchaSecret;
@Value("${recaptcha.fail.silent:false}")
private boolean recaptchaFailSilent;
@Value("${recaptcha.failAttempts.expire:14400}")
private int recaptchaAttemptExpire;
@Value("${recaptcha.failAttempts.max:4}")
private int maxAttempts;
private LoadingCache<String, Integer> attemptsCache;
private int attempts;
public RecaptchaService(final RestTemplate restTemplate) {
this.restTemplate = restTemplate;
attemptsCache = CacheBuilder.newBuilder()
.expireAfterWrite(recaptchaAttemptExpire, TimeUnit.SECONDS)
.build(new CacheLoader<String, Integer>() {
@Override
public Integer load(final String key) {
return 0;
}
});
}
}
解决方案
听起来 RecaptchaService 不是由 spring 管理的。我没有看到 @Component 注释。我对 @Value 注释在非托管 bean 中的工作感到惊讶!
如果您让 spring 管理 RecaptchaService 的生命周期,那么这些值将在构造函数中可用。
推荐阅读
- android - 多个 AlarmManager 触发不会一次触发
- python - 识别对象和标记不起作用“所有的内置方法......”
- react-native - React-Native UI Kitten Demo 中的字体问题
- ios - 颤动的应用程序没有占用 ipad 屏幕的全宽?
- java - 如何使用cmd添加gson创建一个jar
- c# - C# 8 默认接口实现和继承
- flutter - 防止从外部触摸隐藏 showModalBottomSheet
- c# - 绑定到 UserControl 的属性不起作用
- asp.net-core-2.2 - 在 ASP.NET Core 2.2 中创建子类型实例
- python - OpenCV Python CalcHist:如何在 RGB 值范围内堆叠像素数?