Не могу получить изображения из папки WEB-INF, используя classLoader.getResourceAsStream () - PullRequest
3 голосов
/ 09 марта 2011

В полдень я пытался заставить свое приложение отправлять 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 ]

6 голосов
/ 09 марта 2011

Я думаю, вы путаете ClassLoader#getResourceAsStream() с ServletContext#getResourceAsStream(). Первый загружает только ресурсы из пути к классам, а последний загружает только ресурсы из веб-контента (там, где также находится ваша папка /WEB-INF).

Вам нужно поместить эти ресурсы в путь к классам. Если вы используете IDE, то самый простой способ - просто перетащить их в любой пакет в исходной папке Java. Это закончится в /WEB-INF/classes после сборки, которая является частью classpath.

Предположим, что у вас есть пакет com.example.resources.images, и вы поместили туда файл logoemailtemplate.png, затем вы можете загрузить его следующим fileName.

String fileName = "/com/example/resources/images/logoemailtemplate.png";

Альтернативой является добавление папки /WEB-INF/resources в путь к классам. В IDE, такой как Eclipse, вы можете сделать это, добавив ее как Исходная папка в путь сборки проекта. Затем вы можете загрузить его следующим fileName.

String fileName = "/images/logoemailtemplate.png";

Это, однако, не обычная практика.

2 голосов
/ 09 марта 2011

Насколько я знаю, classLoader может получать доступ только к WEB-INF / classes и WEB-INF / lib, но не к WEB-INF / resources. Попробуйте поместить файл в подпапку классов.

0 голосов
/ 09 марта 2011

Вы должны использовать ServletContext.getResourceAsStream () , чтобы загрузить файл из войны. ClassLoader.getResourceAsStream загружает класс из пути к классам.

...