首页 > 解决方案 > 构造函数中的 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;
                    }
                });
    }
}

标签: spring

解决方案


听起来 RecaptchaService 不是由 spring 管理的。我没有看到 @Component 注释。我对 @Value 注释在非托管 bean 中的工作感到惊讶!

如果您让 spring 管理 RecaptchaService 的生命周期,那么这些值将在构造函数中可用。


推荐阅读