Spring Boot-@Value注释不起作用
我尝试使用SmtpAuthenticator创建邮件服务。组件已正确启动,但用户名和密码字段中为空值。为什么?
@Componentpublic class SmtpAuthenticator extends Authenticator {
private static final Logger LOG =
LogManager.getLogger(SmtpAuthenticator.class.getSimpleName());
@Value("${spring.mail.username}")
private String username;
@Value("${spring.mail.password}")
private String password;
public SmtpAuthenticator() {
LOG.info(SmtpAuthenticator.class.getSimpleName() + " started...");
LOG.debug("username=" + username);
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
if (!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) {
LOG.debug("Username and password are correct...");
return new PasswordAuthentication(username, password);
}
LOG.error("Not correct mail login data!");
return null;
}
}
回答:
您猜对了,只有在实例化对象之后,才会注入值。因为弹簧容器无法设置尚不存在的属性。因此,在构造器中,这些字段将仍然为null。一种解决方案是
- 切换到构造器注入而不是二传手注入(YMMV,已测试了您的用例)
- 将构造函数替换为带有注释的方法
@PostConstruct
。该方法将在注射过程后执行。
回答:
@Componentpublic class SmtpAuthenticator extends Authenticator {
private static final Logger LOG =
LogManager.getLogger(SmtpAuthenticator.class.getSimpleName());
@Value("${spring.mail.username}")
private String username;
@Value("${spring.mail.password}")
private String password;
@PostConstruct
public void init() {
LOG.info(SmtpAuthenticator.class.getSimpleName() + " started...");
LOG.debug("username=" + username);
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
if (!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) {
LOG.debug("Username and password are correct...");
return new PasswordAuthentication(username, password);
}
LOG.error("Not correct mail login data!");
return null;
}
}
以上是 Spring Boot-@Value注释不起作用 的全部内容, 来源链接: utcz.com/qa/405372.html