Jsp 使用JavaMail发送电子邮件时EJB类上出现NullPointerException

Jsp 使用JavaMail发送电子邮件时EJB类上出现NullPointerException,jsp,servlets,ejb,jakarta-mail,Jsp,Servlets,Ejb,Jakarta Mail,我正在尝试用JavaMail发送电子邮件。我使用了EJB@Stateless和@LocalBean,但当我尝试发送邮件时,它给了我NullPointerException 我的servlet如下所示: package com.lsp.web; import com.lsp.service.Mailer; import javax.ejb.EJB; import javax.mail.MessagingException; import javax.servlet.ServletExceptio

我正在尝试用JavaMail发送电子邮件。我使用了EJB@Stateless和@LocalBean,但当我尝试发送邮件时,它给了我NullPointerException

我的servlet如下所示:

package com.lsp.web;

import com.lsp.service.Mailer;
import javax.ejb.EJB;
import javax.mail.MessagingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "contact", urlPatterns = {"/contact"})
public class ContactServlet extends SpringInjectedServlet {
@EJB
private Mailer emailBean;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.getRequestDispatcher("contact.jsp").forward(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String customerEmail = req.getParameter("email");
    String subject = req.getParameter("subject");
    String body = req.getParameter("message");

    String error = null;
    String succMess = null;

    try {
        javax.mail.internet.InternetAddress ia = new javax.mail.internet.InternetAddress(customerEmail);
        ia.validate();
        //LINE 34 emailBean.send(customerEmail, subject, body); ------>NullPointerException
        req.setAttribute("succMessage", succMess);
        req.getRequestDispatcher("sent.jsp").forward(req, resp);

    } catch (javax.mail.internet.AddressException ae) {
        error = "您指出的邮箱地址不存在";
        req.setAttribute("errorMessage", error);
        req.getRequestDispatcher("contact.jsp").forward(req, resp);
    }
    catch (MessagingException mex) {
        error = "发送失败";
        req.setAttribute("errorMessage", error);
        req.getRequestDispatcher("contact.jsp").forward(req, resp);
    }
}
}
那么我的EJB类邮件器是:

package com.lsp.service;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

@Stateless
@LocalBean
public class Mailer {
public void send(String from, String subject, String body) {
    String to = "jshao745@gmail.com";
    String host = "localhost";

    Properties properties = System.getProperties();
    properties.setProperty("mail.smtp.host", host);

    Session session = Session.getDefaultInstance(properties);

    try{
        // Create a default MimeMessage object.
        MimeMessage message = new MimeMessage(session);

        // Set From: header field of the header.
        message.setFrom(new InternetAddress(from));

        // Set To: header field of the header.
        message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

        // Set Subject: header field
        message.setSubject(subject);

        // Send the actual HTML message, as big as you like
        message.setText(body);

        // Send message
        Transport.send(message);
        System.out.println("Sent message successfully....");
    }catch (MessagingException mex) {
        mex.printStackTrace();
    }
}
}
然后在JSP上的提交表单上插入消息并点击提交后,我得到了以下异常:

java.lang.NullPointerException
com.lsp.web.ContactServlet.doPost(ContactServlet.java:34)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
com.lsp.web.LoginFilter.doFilter(LoginFilter.java:39)
在pom.xml中,我添加了以下依赖项:

<!--JavaMail API-->
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.5.1</version>
    </dependency>

    <!--EJB-->
    <dependency>
        <groupId>javax.ejb</groupId>
        <artifactId>ejb-api</artifactId>
        <version>3.0</version>
    </dependency>

    <!--Java activation-->
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>

    <!--EJB LocalBean-->
    <dependency>
        <groupId>org.apache.openejb</groupId>
        <artifactId>ejb31-api-experimental</artifactId>
        <version>3.1.1</version>
    </dependency>

com.sun.mail
javax.mail
1.5.1
javax.ejb
EJBAPI
3
javax.activation
激活
1.1.1
org.apache.openejb
ejb31 api实验
3.1.1
我想这与EJB有关,但我不确定哪里做错了

另外,我目前没有关于ejb-jar.xml的任何信息。我需要编辑它吗


如果有人能帮助我,我将不胜感激

请继续检查
emailBean的实例。它没有正确注入,很可能是
null

放置一个调试点,您应该能够验证这是否是导致
NullPointerException
的原因


修复程序取决于环境和设置,这将使适当的实例可用

Tomcat不是EJB容器,因此它不知道EJB是什么。 web容器中忽略了注释
@Stateless
@LocalBean
@EJB

部署在Tomcat中的
Mailer
类只是一个POJO,事实上它是用
@Stateless
@LocalBean
注释的 不会使类成为EJB

同样,在
ContactServlet
类中用于注入
Mailer
实例的
@EJB
注释也被忽略, Tomcat不提供这种服务。由于没有人初始化
emailBean
实例成员, 当您尝试使用空指针异常(与任何其他对象一样)时,会引发空指针异常

JavaEE规范定义了几种组件, 其中一些在web容器(servlet、jsp)中运行,而像ejb这样的其他容器则需要ejb容器。
我建议您阅读一些有关JEE基本架构的内容。

请提供更多有关您环境的信息;你正在使用什么应用服务器?你是如何包装这个应用程序的?servlet和ejb容器是否在不同的JVM中运行?我使用IntelliJ,并在项目模块中添加了所有jar文件。因为我也在使用maven,所以我在pom.xml中添加了所有必需的依赖项。IntelliJ是一个IDE,而不是服务器