2

我们的程序正在发送邮件。对于发送邮件,它包含一个附件。

该项目是用maven设置的。JUnit 测试用例首先加载 spring 配置。Spring 正在使用其DefaultResourceLoader加载文件。当直接在工作区中运行它时,它运行良好,但是作为一个 Maven 测试它失败了。

资源加载器的 Spring 配置:

<property name="defaultResourceLoader">
    <bean class="org.springframework.core.io.DefaultResourceLoader" />
</property>

实施类:

@Service
public class SomeClassA {

     @Autowired
     private DefaultResourceLoader defaultResourceLoader; 

     @Value("${mailLogoPath}")
     private String mailLogo; 

     public void someMethod(){
         String filePath = defaultResourceLoader.getResource(mailLogo).getFile().getAbsolutePath();   
     }
}

异常指向实际问题和区别:

java.io.FileNotFoundException:类路径资源 [templates/efmaillogo.jpg] 无法解析为绝对文件路径,因为它不驻留在文件系统中:jar:file:/C:/IBM/workspace/efMy10/ef-mvxsrv -reactor/ef-mvxsrv-service-resources/target/ef-mvxsrv-service-resources-1.5.23-SNAPSHOT.jar!/templates/efmaillogo.jpg at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java: 204) 在 org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52) 在 SomeClassA.someMethod(SomeClassA.java:9)

Spring 尝试在 jar 中查找文件。在 eclipse 中将其作为 junit 测试运行时,一切正常,因为 spring 直接在工作区中找到该文件。但是,当使用 maven 运行相同的单元测试时,它会失败,因为它找不到文件,因为它在不同模块的 jar 中。另一个模块中的文件是不同模块需要的,所以我不想移动它。在部署了所有内容的应用程序服务器上,它也可以正常工作,因为 .ear 文件已展开。

我想知道是否有其他方法可以使用 Spring 访问文件,这样我就不必使用 maven 跳过这个测试用例。

更新 尝试使用以下方法查找文件:

 String filePath = defaultResourceLoader.getResource(mailLogo).getURL.getFile();

但是,它现在在实际发送邮件时失败了Transport.send(msg)

java.io.FileNotFoundException: 文件:\C:\Users\uhe.m2\repository\com\clavisit\ef\mvxsrv\ef-mvxsrv-service-resources\1.5.23-SNAPSHOT\ef-mvxsrv-service-resources- 1.5.23-SNAPSHOT.jar!\templates\efmaillogo.jpg(文件名、目录名或卷标语法不正确。)在 com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1141) at javax .mail.Transport.send0(Transport.java:195) 在 javax.mail.Transport.send(Transport.java:124) 在 com.clavisit.ef.ep.service.integration.handler.mail.SendMail.sendMessage(SendMail .java:153)

4

1 回答 1

2

字符串文件路径 = defaultResourceLoader.getResource(mailLogo)。获取URL( ) .getFile();

上述代码更改必须按照此线程http://www.coderanch.com/t/474047/Spring/Spring-cannot-find-file-classpath中的讨论工作

于 2012-06-18T08:58:07.910 回答