FileNotFoundException в тестовом случае запускается с Maven с помощью загрузчика ресурсов Spring
Наша программа отправляет письма. Для отправки почты в него входит вложение.
Проект настроен с Maven. Контрольный пример JUnit сначала загружает конфигурацию пружины. Spring загружает файл с помощью DefaultResourceLoader. При запуске этого непосредственно в рабочей области он работает нормально, однако в качестве теста maven он не проходит.
Конфигурация Spring для загрузчика ресурсов:
<property name="defaultResourceLoader">
<bean class="org.springframework.core.io.DefaultResourceLoader" />
</property>
ImplementingClass:
@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 в org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:204) в org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52) в SomeClassA.someMethod(SomeClassA.java:9)
Спринг пытается найти файл в банке. При запуске его в качестве теста junit в eclipse все работает, потому что Spring находит файл непосредственно в рабочей области. Однако при запуске того же модульного теста с maven он завершается неудачно, потому что не находит файл, потому что он находится в банке в другом модуле. Файл в другом модуле нужен другим модулям, поэтому я не хочу его перемещать. На сервере приложений, на котором все развернуто, он также работает, потому что файл.ear расширяется.
Мне интересно, есть ли другой способ получить доступ к файлу с помощью Spring, чтобы мне не пришлось пропустить этот тестовый пример с Maven.
Обновление Попытка поиска файла:
String filePath = defaultResourceLoader.getResource(mailLogo).getURL.getFile();
Однако теперь происходит сбой при отправке почты с Transport.send(msg)
,
java.io.FileNotFoundException: файл:\C:\Users\uhe.m2\ хранилище \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) в 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)
1 ответ
Строка filePath = defaultResourceLoader.getResource (mailLogo).getURL ().getFile ();
Вышеуказанное изменение кода должно работать в соответствии с обсуждением в этой теме http://www.coderanch.com/t/474047/Spring/Spring-cannot-find-file-classpath