Jsp 使用JavaMail发送电子邮件时EJB类上出现NullPointerException
我正在尝试用JavaMail发送电子邮件。我使用了EJB@Stateless和@LocalBean,但当我尝试发送邮件时,它给了我NullPointerException 我的servlet如下所示: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
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,而不是服务器