2014-01-17 3 views
0

Я пытаюсь отправить электронное письмо с помощью JavaMail. Я использовал EJB @Stateless и @LocalBean, но он дал мне NullPointerException при попытке отправить почту.NullPointerException на классе EJB при отправке электронной почты с помощью JavaMail

Мой сервлет выглядит следующим образом:

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 класс Mailer является:

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 = "[email protected]"; 
    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> 

Я предполагаю, что это связано с EJB, но я не уверен, где я ошибся.

Кроме того, у меня в настоящее время ничего нет на ejb-jar.xml. Нужно ли его редактировать?

Я ценю, если кто-то может мне помочь.

+0

, пожалуйста, предоставьте дополнительную информацию о вашей среде; какой сервер приложений вы используете? как вы упаковали приложение? являются ли сервлеты и контейнеры ejb запущенными в разных JVM? –

+0

Я использую IntelliJ, и я добавил все файлы jar в Project Modules. Поскольку я также использую maven, я добавил все необходимые зависимости в pom.xml. – user3014926

+0

IntelliJ - это IDE, а не сервер –

ответ

0

Tomcat не является контейнером EJB, поэтому он не знает, что такое EJB. Аннотации @Stateless, @LocalBean и @EJB просто игнорируются в веб-контейнере.

Ваш Mailer класс развернуты в Tomcat просто POJO, тот факт, что она помечается @Stateless и @LocalBean не делает класс EJB-компонент.

В том же образом, @EJB аннотаций используется в ContactServlet классе, чтобы ввести Mailer экземпляр также игнорируется, Tomcat не предоставляет такого рода услуги. Из-за того, что никто не инициализировал член экземпляра emailBean, исключение NullPointer бросается, когда вы пытаетесь его использовать (как и любой другой объект).

Спецификация JavaEE определяет несколько видов компонентов: некоторые из них запускаются в веб-контейнере (сервлеты, jsp), а другие, такие как ejb, нуждаются в контейнере EJB. Я предлагаю вам прочитать articles о базовой архитектуре JEE.

0

Пожалуйста, проверьте экземпляр emailBean. Он не вводится правильно и, скорее всего, null.

Поместите точку отладки, и вы должны иметь возможность проверить, является ли это причиной для NullPointerException.

Исправление зависит от среды и настроек, которые позволят использовать соответствующий экземпляр.

Смежные вопросы