Spring Boot - @Value注释不起作用

时间:2017-09-21 17:01:55

标签: java spring spring-boot annotations

我尝试使用SmtpAuthenticator创建邮件服务。组件正确启动,但空值在用户名和密码字段中。为什么?

谢谢。

@Component
public 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;
    }
}

2 个答案:

答案 0 :(得分:5)

你猜对了,只有在实例化对象后才会注入值;因为弹簧容器不能设置尚不存在的东西的属性。因此,在构造函数中,这些字段仍为null。一种解决方案是,

  1. 切换到constructer Injection而不是setter Injection(YMMV,已经测试过你的用例)
    1. 使用注释为@PostConstruct的方法替换构造函数。该方法将在注射过程后执行。
    2. 例如

      @Component
      public 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;
          }
      }
      

答案 1 :(得分:0)

我尝试通过MailService中的getter调用用户名和密码,并显示正确的值。完成构造函数调用后,值是否可以访问?