我正在研究与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;
}
});
}
}
答案 0 :(得分:0)
我们将假定您的服务上有一个@Component
或等效注释。
实际上,在构造对象的过程中,尚未注入值。然后在您的构造函数中,recaptchaAttemptExpire
等于0(即使您设置了默认注入值)。
似乎是服务,然后尝试在attemptsCache
方法中初始化您的@PostConstruct
字段?
答案 1 :(得分:0)
像RecaptchaService这样的声音不是由spring管理的。我没有看到@Component批注。我很惊讶@Value注释在一个不受管理的bean中完全起作用!
如果让spring管理RecaptchaService的生命周期,则这些值将在构造函数中可用。