当前位置: 首页 > 知识库问答 >
问题:

属性源未自动连接

潘慈
2023-03-14

出于某种原因,我使用外部属性源,其中一个外部属性源没有自动连接,在创建身份验证bean时接收空指针

原因: org.springframework.beans.BeanInstantiationException: Failed to instanceiate [com.filechecker.check.Authenticator]: Constructor threw exception;nested exception is java.lang.NullPointerException

Caused by: java.lang.NullPointerException: null at com.filechecker.check.Authenticator.(身份验证器.java:30) ~[类!/:0.0.1-快照]

    String username = emailPropertyConfig.getEmailConfig().getUsername();
@Component
@PropertySource(value="${email.app.properties}",ignoreResourceNotFound = false)
@ConfigurationProperties
public class PropertyEmailConfiguration {

    private EmailConfig emailConfig =  new EmailConfig();

    public EmailConfig getEmailConfig() {
        return emailConfig;
    }

    public void setEmailConfig(EmailConfig emailConfig) {
        this.emailConfig = emailConfig;
    }
}


@Component
public class Authenticator extends javax.mail.Authenticator {

    @Autowired
    PropertyEmailConfiguration emailPropertyConfig;

    @Autowired
    CipherCrypt cipherCrypt;

    private PasswordAuthentication authentication;

    public Authenticator() throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeySpecException {

        String username = emailPropertyConfig.getEmailConfig().getUsername();
        String password = cipherCrypt.decrypt(emailPropertyConfig.getEmailConfig().getEncryptPassword());
        authentication = new PasswordAuthentication(username, password);
    }

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return authentication;
    }
}
@Component
@PropertySource(value="${external.app.properties}", ignoreResourceNotFound = true)
@ConfigurationProperties
public class PropertyConfiguration {

    private List<FileStructureConfig> fileStructureConfig = new ArrayList();

    private List<EmailSendingProperties> emailSendingProperties  = new ArrayList();

    public List<FileStructureConfig> getFileStructureConfig() {
        return fileStructureConfig;
    }

    public void setFileStructureConfig(List<FileStructureConfig> fileStructureConfig) {
        this.fileStructureConfig = fileStructureConfig;
    }

    public List<EmailSendingProperties> getEmailSendingProperties() {
        return emailSendingProperties;
    }

    public void setEmailSendingProperties(List<EmailSendingProperties> emailSendingProperties) {
        this.emailSendingProperties = emailSendingProperties;
    }


}

共有1个答案

艾俊悟
2023-03-14

您正在尝试访问构造函数中的@Autowired属性。在此阶段无法自动连接属性。为了让Spring“烘焙bean”,Spring必须创建您的对象(使用您的构造函数),然后才应用自动连接机制来注入<code>emailPropertyConfig。因此,您无法访问构造函数中的两个<code>@Autowired<code>属性。

如果您需要从电子邮件中提取一些值PropertyConfigcipherCrypt,则可以@PostConstruct

@Component
public class Authenticator {

    @Autowired
    PropertyEmailConfiguration emailPropertyConfig;

    @Autowired
    CipherCrypt cipherCrypt;

    private PasswordAuthentication authentication;

    @PostConstruct
    void init() throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeySpecException {

      String username = emailPropertyConfig.getEmailConfig().getUsername();
      String password = cipherCrypt.decrypt(emailPropertyConfig.getEmailConfig().getEncryptPassword());
      authentication = new PasswordAuthentication(username, password);
    }

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
      return authentication;
    }
}

或使用构造函数注入:

@Component
public class Authenticator {

    PropertyEmailConfiguration emailPropertyConfig;

    CipherCrypt cipherCrypt;

    private PasswordAuthentication authentication;

    public Authenticator(PropertyEmailConfiguration emailPropertyConfig, CipherCrypt cipherCrypt) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeySpecException {

      String username = emailPropertyConfig.getEmailConfig().getUsername();
      String password = cipherCrypt.decrypt(emailPropertyConfig.getEmailConfig().getEncryptPassword());
      authentication = new PasswordAuthentication(username, password);
    }

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
      return authentication;
    }
}
 类似资料:
  • 我是Spring的新手。我正面临Spring-Boot的问题。我正在尝试将外部配置文件中的字段自动装配到自动装配的bean中。我有以下类 应用程序。Java语言 AppConfig。Java语言 服务接口 服务1 我无法在App类的postconstruct方法中显示服务名称变量。我这样做对吗?

  • 我正在使用MapStruct和在我的代码中的不同业务用例之间共享的大模型(超过50个字段)。根据入口点的不同,有些属性将被映射,有些则不被映射。当我构建我的项目时,我总是会得到“警告:未映射的目标属性”消息。 我已经研究过,并且看到可以通过使用语义命令来告诉mapstruct忽略该字段 问题是,给定我的对象具有如此多的字段,忽略每个映射器类中的每个属性将需要大量的代码。我也不想在我的日志上出现这个

  • 是否有方法自动关联从属性文件读取的另一个列表中包含字符串的列表?我发现的困难是属性值需要拆分成字符串列表(或数组),然后自动连接到。我的属性文件如下所示: 现在,我希望我的用户能够添加行到该文件,每当有新的作业。所以我从来不知道钥匙的名字,也不知道行数。有什么方法可以自动连接文件条目到列表中,该列表本身包含包含4个字符串的列表(由“,”分割)?也许这整个方法不是最好的。如果有,请随时告诉我。

  • 在Spring Boot应用程序中,我尝试设置多个数据库连接。我已经开始构建主数据源,但是在mySqlEntityManagerFactory方法上出现以下错误。 无法自动连线。没有EntityManagerFactoryBuilder的bean 如何自动连接EntityManagerFactoryBuilder? 我正试图遵循这个博客上的代码https://raymondhlee.wordpre

  • 那么我的问题是,@javax为什么会这样做。注释。资源工作,但@AutoWired没有工作。为了在Restful控制器上进行测试,我尝试将MappingJackson2HttpMessageConverter注入@Autowired,在启动时,容器未能找到符合条件的bean,即使该类位于路径上。现在,为了解决这个问题,我进入了一个上下文xml文件并添加了bean: 然后在测试类中有成员变量: 然后