构造函数中的CacheBuilder初始化不使用Spring注释值

时间:2019-02-19 14:48:25

标签: spring

我正在研究与Google 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;
                    }
                });
    }
}

2 个答案:

答案 0 :(得分:0)

我们将假定您的服务上有一个@Component或等效注释。

实际上,在构造对象的过程中,尚未注入值。然后在您的构造函数中,recaptchaAttemptExpire等于0(即使您设置了默认注入值)。

似乎是服务,然后尝试在attemptsCache方法中初始化您的@PostConstruct字段?

答案 1 :(得分:0)

像RecaptchaService这样的声音不是由spring管理的。我没有看到@Component批注。我很惊讶@Value注释在一个不受管理的bean中完全起作用!

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