Не удается извлечь изображения из папки WEB-INF ussing classLoader.методаgetresourceasstream()
В полдень я пытался заставить свое приложение отправлять оба html + изображения через javamail, мне удалось отправить только html, но с изображением у меня возникли некоторые проблемы. Я решил создать составное сообщение, и все шло хорошо, но затем я использую загрузчик класса для извлечения .png файл из WEB-INF / resources / images Я получаю NullPointerExcetion, я не знаю, почему это так?
Вот как выглядит мой EJB (3.0). Я ценю руку на этот раз, у меня нет большого опыта работы с ClassLoader класс (не знаю много об этом).
@Stateless(name = "ejbs/EmailServiceEJB")
public class EmailServiceEJB implements IEmailServiceEJB {
@Resource(name = "mail/myMailSession")
private Session mailSession;
public void sendAccountActivationLinkToBuyer(String destinationEmail,
String name) {
// Destination of the email
String to = destinationEmail;
String from = "dontreply2thismessage@gmail.com";
try {
Message message = new MimeMessage(mailSession);
// From: is our service
message.setFrom(new InternetAddress(from));
// To: destination given
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
message.setSubject("Uspijesna registracija");
// How to found at http://www.rgagnon.com/javadetails/java-0321.html
message.setContent(generateActivationLinkTemplate(), "text/html");
Date timeStamp = new Date();
message.setSentDate(timeStamp);
// Prepare a multipart HTML
Multipart multipart = new MimeMultipart();
// Prepare the HTML
BodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(generateActivationLinkTemplate(), "text/html");
multipart.addBodyPart(htmlPart);
// PREPARE THE IMAGE
BodyPart imgPart = new MimeBodyPart();
String fileName = "/WEB-INF/resources/images/logoemailtemplate.png";
ClassLoader classLoader = Thread.currentThread()
.getContextClassLoader();
if (classLoader == null) {
classLoader = this.getClass().getClassLoader();
if (classLoader == null) {
System.out.println("IT IS NULL AGAIN!!!!");
}
}
DataSource ds = new URLDataSource(classLoader.getResource(fileName));
imgPart.setDataHandler(new DataHandler(ds));
imgPart.setHeader("Content-ID", "the-img-1");
multipart.addBodyPart(imgPart);
// Set the message content!
message.setContent(multipart);
Transport.send(message);
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
Я хотел бы упомянуть, что я использую JEE6 с glassfishV3 я не знаю, совместим ли мой подход с этим сервером приложений.
обновление Когда я изменяю приведенный выше код на
String fileName = "logoemailtemplate.png";
Я получаю электронное письмо, оно работает.
Но теперь я не получаю текст. :) Есть ли какая-то ошибка?3 ответа:
Мне кажется, ты путаешь.
ClassLoader#getResourceAsStream()
с помощьюServletContext#getResourceAsStream()
. Первый загружает ресурсы только из classpath, в то время как второй загружает ресурсы только из webcontent (там, где также находится ваша папка/WEB-INF
).Вам нужно поместить эти ресурсы в путь к классу. Если вы используете IDE, то самый простой способ-это просто поместить их в любой пакет в папке исходного кода Java. Он будет в конечном итоге в
/WEB-INF/classes
после сборки,которая является частью пути к классу.Предположим, что если у вас есть пакет
com.example.resources.images
и вы бросили туда файлlogoemailtemplate.png
, то вы можете загрузить его следующим образомfileName
.String fileName = "/com/example/resources/images/logoemailtemplate.png";
В качестве альтернативы можно добавить папку
/WEB-INF/resources
в classpath. В IDE, такой как Eclipse, вы можете сделать это, добавив его как исходную папку в путь сборки проекта. Затем вы можете загрузить его следующим образомfileName
.Однако это не является обычной практикой.String fileName = "/images/logoemailtemplate.png";
Насколько мне известно, загрузчик классов может обращаться только к WEB-INF/classes и WEB-INF/lib, но не к WEB-INF/resources. Попробуйте поместить файл в подпапку classes.
Необходимо использовать ServletContext.getResourceAsStream () для загрузки файла из войны. загрузчик классов.getResourceAsStream загружает класс из пути к классу.