java - 使用 Spring 资源加载器通过 Maven 运行的测试用例中的 FileNotFoundException

标签 java spring maven junit filenotfoundexception

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

项目是用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: class path resource [templates/efmaillogo.jpg] cannot be resolved to absolute file path because it does not reside in the file system: 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) at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52) at 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: file:\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 (The filename, directory name, or volume label syntax is incorrect.) at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1141) at javax.mail.Transport.send0(Transport.java:195) at javax.mail.Transport.send(Transport.java:124) at com.clavisit.ef.ep.service.integration.handler.mail.SendMail.sendMessage(SendMail.java:153)

最佳答案

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

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

关于java - 使用 Spring 资源加载器通过 Maven 运行的测试用例中的 FileNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11078838/

相关文章:

java - HttpPost 添加到 url HTTP/1.1

java - 高性能 JMS 消息传递

Maven 发布 :prepare fails with "scm connection or developerConnection must be specified"

sql - Maven 版本排序

java - 如何为通知方法提供切入点绑定(bind)注释?

java - 使用 jgitflow 将 Artifact 部署到非默认的 nexus 服务器

java - 如何扩展两类 Android Activity ?

java - 使用 Java 操作 Javascript

java - (Java) JPanel 中出现/消失的 JLabel 仅在调整大小时消失

javascript - 从 servlet 响应中下载 JavaScript 中的 Excel