2012-09-04 6 views
3

스프링 MVC 웹 응용 프로그램과 JavaMailSender를 사용하는 Tomcat 7에서 등록 확인 전자 메일을 보내려고하지만 항상 NullPointerException을 반환합니다. 아무도 왜 내가 null 포인터를 얻을 알아낼 수 있습니까? (바람둥이 conf 폴더에서)null 포인터 예외를 반환하는 JavaMailSender

web.xml을

<!-- jndi mail session --> 
<resource-ref> 
    <description> 
     Resource reference to a factory for javax.mail.Session 
     instances that may be used for sending electronic mail 
     messages, preconfigured to connect to the appropriate 
     SMTP server. 
    </description> 
    <res-ref-name>mail/Session</res-ref-name> 
    <res-type>javax.mail.Session</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 

응용 프로그램-servlet.xml에

<!-- Mail Sender bean definition --> 

<bean id="smtpSession" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName" value="java:comp/env/mail/session"/> 
</bean> 

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
    <property name="session" ref="smtpSession"/> 
    <!-- 
    <property name="host" value="smtp.gmail.com" /> 
    <property name="port" value="465" /> 
    <property name="username" value="[email protected]" /> 
    <property name="password" value="test123" /> 
    <property name="protocol" value="smtp" /> 


    <property name="defaultEncoding" value="UTF-8"/> 

    <property name="javaMailProperties"> 
     <props> 
      <prop key="mail.smtp.auth">true</prop> 
      <prop key="mail.smtp.connectiontimeout">5000</prop> 
      <prop key="mail.smtp.sendpartial">true</prop> 
      <prop key="mail.smtp.userset">true</prop> 
      <prop key="mail.mime.charset">UTF-8</prop> 
      <prop key="mail.smtp.isSecure">true</prop> 
      <prop key="mail.smtp.requiresAuthentication">true</prop> 
      <prop key="mail.smtp.auth">true</prop> 
      <prop key="mail.smtp.port">465</prop> 
      <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop> 
      <prop key="mail.smtp.socketFactory.fallback">false</prop> 
      <prop key="mail.smtp.starttls.enable">true</prop> 
      <prop key="mail.debug">true</prop> 
     </props> 
    </property> 
    --> 
</bean> 

<bean id="simpleMailMessage" class="org.springframework.mail.SimpleMailMessage"> 
    <property name="from" value="[email protected]"/>  
</bean> 

의 context.xml

<Context path="/MVC" docBase="MVC" debug="5" crossContext="false"> 
<Resource name="mail/session" 
    auth="Container" 
     type="javax.mail.Session" 
     username="[email protected]" 
     password="test23" 
     mail.debug="true" 
     mail.user="[email protected]" 
     mail.password="test123" 
     mail.transport.protocol="smtp" 
     mail.smtp.host="smtp.gmail.com" 
     mail.smtp.auth="true" 
     mail.smtp.port="25" 
     mail.smtp.starttls.enable="true" 
/> 

센드 : 아래 내 설정 설정입니다. java

import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.mail.MailException; 
import org.springframework.mail.MailParseException; 
import org.springframework.mail.MailSender; 
import org.springframework.mail.SimpleMailMessage; 
import org.springframework.mail.javamail.JavaMailSender; 
import org.springframework.mail.javamail.MimeMessageHelper; 
import org.springframework.mail.javamail.MimeMessagePreparator; 
import org.springframework.stereotype.Service; 

import com.wbkit.mvc.domain.User; 


@Service 
public class SendMail 
{ 
@Autowired 
private JavaMailSender mailSender; 
@Autowired 
private SimpleMailMessage simpleMailMessage; 



public void confirmRegistrationMail(User user) 
{ 


    MimeMessage message = mailSender.createMimeMessage(); 

    try 
    { 
     MimeMessageHelper helper = new MimeMessageHelper(message, true); 

     helper.setFrom(simpleMailMessage.getFrom()); 
     helper.setTo(user.getEmail()); 
     helper.setSubject("MVC Registration"); 
     helper.setText("Hello " + user.getFirstName() + " " 
       + user.getLastName() + ", \n" + 
       " Your MVC Account Registration was successful. Your user ID is " 
       + user.getEmail() + " and your password is " 
       + user.getUserPass() + ".\n" + 
       "You can now access the mobile applicatoin or the web application " 
       + " your user name (email) and password."); 


    } 
    catch (MessagingException e) 
    { 
     throw new MailParseException(e); 
    } 
    mailSender.send(message); 


} 

public void requireApprovalMail(final User user) 
{ 


} 


} 

스택 추적 :

센드에서
MimeMessage message = mailSender.createMimeMessage(); 

에 com.wbkit.mvc.util.SendMail.confirmRegistrationMail (SendMail.java:79) 지점에서

4-Sep-2012 7:47:16 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [MVC] in context with path [/MVC] threw   exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause 
java.lang.NullPointerException 
at com.wbkit.mvc.util.SendMail.confirmRegistrationMail(SendMail.java:79) 
at com.wbkit.mvc.web.main.RegisterController.save(RegisterController.java:276) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at  org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565) 
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1812) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

java.lang.NullPointerException이. 자바. 나는 주석 코드 중 일부를 제거했다.

귀하의 제안과 도움에 감사드립니다.

+2

스택 추적을 게시하면 도움이됩니다. –

+0

스택 추적을 추가했습니다. –

+0

stacktrace가 SendMail의 79 번째 줄에서 NPE를 가리키고 있지만, 게시 한 SendMail.java 파일에는 많은 행이 포함되어 있지 않습니다. NPE가 던져지는 SendMail.java 줄을 강조 표시 할 수 있습니까? –

답변

0

귀하의 예외에 대한 세부 사항을 제외한 모든 항목이 포함 된 것으로 보입니다.

또한 속성 이름을 구성하는 것처럼 보입니다. 구성에있는 여러 속성이 유효한 JavaMail 속성이 아닙니다. 또한 common mistakes 목록을 참조하십시오.

0

응용 프로그램이 시작될 때 로깅을 검사하여 JavaMailSender가 SendMail에 연결되어 있는지 확인할 수 있습니다. org.springframework 로깅을 DEBUG로 설정해야 할 수도 있습니다.

왜 나는 아직 볼 수 없지만 배선이 잘못되었다고 생각됩니다.

-1

autowiring을 수행 한 도우미 클래스의 @Service 주석을 작성하십시오. 그런 다음 해당 클래스를 사용하는 클래스에서 @autowire 주석을 사용하십시오.

1

동일한 오류가 발생했습니다. JavaMailSender bean을 autowired 필드로 사용하는 클래스의 수동 인스턴스화에서 왔습니다. OP가 게시 한 코드에는 SendMail 서비스 클래스가 있습니다.

This question 수동으로 생성 된 객체의 autowired 필드는 JavaMailSender 빈에 대한 실제 참조를받지 못했습니다. 스프링은 그 마법을 수행해야한다는 것을 알지 못하기 때문입니다. 그것은 이후에 아주 분명합니다.

희망이 있으면 도움이됩니다.

관련 문제