java - 无法使用 classLoader.getResourceAsStream() 从 WEB-INF 文件夹中检索图像

标签 java jakarta-ee glassfish ejb-3.0 jakarta-mail

中午暂停时,我试图让我的应用程序通过 javamail 发送 html+图像,但我只成功发送了 html,但是图像我遇到了一些问题。我决定创建一个多部分消息,一切正常,但后来我使用类加载器从 WEB-INF/resources/images 检索 .png 文件,我得到一个 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";

我收到了一封电子邮件,它有效。

但是现在我没有收到短信。 :) 有什么错误吗?

最佳答案

我觉得你很困惑 ClassLoader#getResourceAsStream()ServletContext#getResourceAsStream() .前者仅从类路径加载资源,而后者仅从网络内容加载资源(您的 /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 文件夹添加到类路径中。在像 Eclipse 这样的 IDE 中,您可以通过将其作为 Source 文件夹 添加到项目的构建路径中来实现。然后你可以通过下面的fileName加载它。

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

但这不是常见的做法。

关于java - 无法使用 classLoader.getResourceAsStream() 从 WEB-INF 文件夹中检索图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5250704/

相关文章:

java - 除index.xhtml 外,JSF 页面未执行

java - 从 Jersey RESTful Web 服务中抛出信息性错误消息

java - GWT 应用程序 : server-wide context, 在哪里运行初始请求并保留其结果,以便每个 session 稍后访问此结果?

java - 有没有一种更快的方法可以在Java中列表的某个索引之后返回子列表?

将模块添加到Android项目时出现Java.lang.verifyError

java - 具有相同输出的断言失败错误

java - 将 SQL 选择结果集直接打印到 HTML 网页上?

java - Netbeans:如何将 Java EE 容器添加到 java 项目

spring - 创建 beanfactory 对象有哪些不同的方法?

Glassfish 4.1 - 最新 Jersey 版本