Не удается извлечь изображения из папки 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 3

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 загружает класс из пути к классу.