Spring Boot 从 app.properties 加载另一个文件

Posted

技术标签:

【中文标题】Spring Boot 从 app.properties 加载另一个文件【英文标题】:Spring Boot load another file from app.properties 【发布时间】:2017-04-14 22:19:45 【问题描述】:

我是 Spring Boot 的新手。我在src/main/resource 中有这个emailprop.properties

       //your private key  
       mail.smtp.dkim.privatekey=classpath:/emailproperties/private.key.der

但我得到的错误是

classpath:\email properties\private.key.der(文件名、目录 名称或卷标语法不正确)

如何正确加载此文件?

Update-1

我的 java 代码是 dkimSigner = new DKIMSigner(emailProps.getProperty("mail.smtp.dkim.signingdomain"), emailProps.getProperty("mail.smtp.dkim.selector"), emailProps.getProperty("mail.smtp.dkim.privatekey"));

它作为"D:\\WorkShop\\MyDemoProj\\EmailService\\src\\main\\resources\\private.key.der"而不是emailProps.getProperty("mail.smtp.dkim.privatekey")工作

Update-2

我试过java代码是 String data = ""; ClassPathResource cpr = new ClassPathResource("private.key.der"); try byte[] bdata = FileCopyUtils.copyToByteArray(cpr.getInputStream()); data = new String(bdata, StandardCharsets.UTF_8); catch (IOException e) e.printStackTrace(); dkimSigner = new DKIMSigner(emailProps.getProperty("mail.smtp.dkim.signingdomain"), emailProps.getProperty("mail.smtp.dkim.selector"),data);

错误是:java.io.FileNotFoundException: class path resource [classpath:private.key.der] cannot be resolved to URL because it does not exist

试过的代码是: ClassPathResource resource = new ClassPathResource(emailProps.getProperty("mail.smtp.dkim.privatekey")); File file = resource.getFile(); String absolutePath = file.getAbsolutePath();

还是一样的错误..

请更新答案..

【问题讨论】:

首先,您是如何尝试从资源文件夹中加载文件的?你试过this one 或this answer 吗?? File file = new File(String.valueOf(this.getClass().getResource("classpath:/emailproperties/private.key.der"))); @GingerHead 感谢重播。我已经尝试过,但错误为 EmailSmsService\class path resource [private.key.der] java.io.FileNotFoundException 【参考方案1】:

如果您想加载此文件运行时,那么您需要使用 ResourceLoader 请查看 here 的文档 - 第 8.4 节。

Resource resource = resourceLoader.getResource("classpath:/emailproperties/private.key.der");

现在,如果您想将此确切路径保留在属性文件中,您可以将其保留在那里,然后将其加载到您的 Autowired 构造函数/字段中,如下所示:

@Value("$mail.smtp.dkim.privatekey") String pathToPrivateKey

然后将其传递给资源加载器。

您可以找到here 的完整示例。我不想复制粘贴它。

【讨论】:

我的java代码是:dkimSigner = new DKIMSigner(emailProps.getProperty("mail.smtp.dkim.signingdomain"), emailProps.getProperty("mail.smtp.dkim.selector"), emailProps.getProperty("mail.smtp.dkim.privatekey"));【参考方案2】:

如果您的文件位于此处:

"D:\\WorkShop\\MyDemoProj\\EmailService\\src\\main\\resources\\private.key.der" 

那么应该是:

mail.smtp.dkim.privatekey=classpath:private.key.der

编辑: 我现在看到,您正在使用 DKIMSigner,它需要文件路径字符串,

尝试像这样更改您的代码:

ClassPathResource resource = new ClassPathResource(emailProps.getProperty("mail.smtp.dkim.privatekey"));
File file = resource.getFile();
String absolutePath = file.getAbsolutePath();
dkimSigner = new DKIMSigner(emailProps.getProperty("mail.smtp.dkim.signingdomain"), emailProps.getProperty("mail.smtp.dkim.selector"),absolutePath
);

【讨论】:

仍然出现错误,如果是 System.out.println(emailProps.getProperty("mail.smtp.dkim.privatekey")),这里正在打印 class path resource [private.key.dev] 谢谢,但我仍然收到此错误。 java.io.FileNotFoundException: class path resource [classpath:private.key.der] cannot be resolved to URL because it does not exist

以上是关于Spring Boot 从 app.properties 加载另一个文件的主要内容,如果未能解决你的问题,请参考以下文章

从 json 文件加载 spring-boot 属性

从 Spring Boot 1.5 升级时为 Spring Boot 2.0 acuator 框架配置安全性

如何从 spring-boot-starter-parent 中排除特定依赖项

21. Spring Boot过滤器监听器从零开始学Spring Boot

如何从 Spring Boot 提供静态 html?

从Spring-Boot开始深入理解Spring系列——Spring-Boot使用servletsfilterlistenerinterceptor