使用 spring 邮件发送电子邮件时出现空指针异常
Getting null pointer exception while sending email using spring mail
我正在尝试使用 spring 实现电子邮件功能(出于我的学习目的)。
这是代码片段:
@Autowired
static
ApplicationContext applicationContext;
/**
* <p>
* Utility classes, which are collections of static members, are not meant to be
* instantiated. Even abstract utility classes, which can be extended, should
* not have public constructors.
*
* Java adds an implicit public constructor to every class which does not define
* at least one explicitly. Hence, at least one non-public constructor should be
* defined.
*
* </p>
*/
private EmailUtility() {
}
//@Autowired
//private static JavaMailSender mailSender;
public static void sendSimpleMessage(String to, String subject, String text, boolean trainTicket,
boolean flightTicket) throws MessagingException {
JavaMailSender mailSender = applicationContext.getBean("mailSender",JavaMailSenderImpl.class);
MimeMessage message = mailSender.createMimeMessage();
String pathToAttachment = "";
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(text);
if (trainTicket && !flightTicket) {
pathToAttachment = AppConstants.TRAIN_TICKET_FILE;
} else if (!trainTicket && flightTicket) {
pathToAttachment = AppConstants.FLIGHT_TICKET_FILE;
}
if (Objects.nonNull(pathToAttachment) && !pathToAttachment.isEmpty()) {
FileSystemResource file = new FileSystemResource(new File(pathToAttachment));
helper.addAttachment("Ticket", file);
}
mailSender.send(message);
}
}
我的申请背景:
<!-- Step 3: Add support for component scanning -->
<context:component-scan base-package="com.patcyy.vamonos" />
<!-- Step 4: Add support for conversion, formatting and validation support -->
<mvc:annotation-driven/>
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="abcd.abcd.com"/>
<property name="port" value="2525"/>
<property name="username" value="admin@abcd.com"/>
<property name="password" value="test"/>
<property name="javaMailProperties">
<props>
<prop key="mail.transport.protocol">smtp</prop>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.debug">true</prop>
</props>
</property>
</bean>
我在初始化 JavaMailSender 时遇到空指针异常。(在这一行中 JavaMailSender mailSender = applicationContext.getBean("mailSender",JavaMailSenderImpl.class);)
堆栈跟踪:
java.lang.NullPointerException
在 com.patcyy.vamonos.utills.EmailUtility.sendSimpleMessage(EmailUtility.java:61)
在 com.patcyy.vamonos.services.StaticContentService.postEnquiry(StaticContentService.java:82)
在 com.patcyy.vamonos.controller.StaticContentController.postEnquiry(StaticContentController.java:143)
在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在 java.lang.reflect.Method.invoke(Method.java:498)
在 org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:891)
在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
在 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)
在 javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
在 javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770)
在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
在 java.lang.Thread.run(Thread.java:748)
我认为主要问题是您将实用程序定义为服务。
无论如何,如果你想在非托管对象中使用 Spring 托管 bean,你可以这样做
@Component public class ContextInitializer {
@Autowired
private JavaMailSender mailSender;
@PostConstruct
public void postConstruct() {
EmailUtility.setMailSender(mailSender);
}
}
并在 EmailUtility class 中添加一个 setter 方法 class。
我正在尝试使用 spring 实现电子邮件功能(出于我的学习目的)。 这是代码片段:
@Autowired
static
ApplicationContext applicationContext;
/**
* <p>
* Utility classes, which are collections of static members, are not meant to be
* instantiated. Even abstract utility classes, which can be extended, should
* not have public constructors.
*
* Java adds an implicit public constructor to every class which does not define
* at least one explicitly. Hence, at least one non-public constructor should be
* defined.
*
* </p>
*/
private EmailUtility() {
}
//@Autowired
//private static JavaMailSender mailSender;
public static void sendSimpleMessage(String to, String subject, String text, boolean trainTicket,
boolean flightTicket) throws MessagingException {
JavaMailSender mailSender = applicationContext.getBean("mailSender",JavaMailSenderImpl.class);
MimeMessage message = mailSender.createMimeMessage();
String pathToAttachment = "";
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(text);
if (trainTicket && !flightTicket) {
pathToAttachment = AppConstants.TRAIN_TICKET_FILE;
} else if (!trainTicket && flightTicket) {
pathToAttachment = AppConstants.FLIGHT_TICKET_FILE;
}
if (Objects.nonNull(pathToAttachment) && !pathToAttachment.isEmpty()) {
FileSystemResource file = new FileSystemResource(new File(pathToAttachment));
helper.addAttachment("Ticket", file);
}
mailSender.send(message);
}
}
我的申请背景:
<!-- Step 3: Add support for component scanning -->
<context:component-scan base-package="com.patcyy.vamonos" />
<!-- Step 4: Add support for conversion, formatting and validation support -->
<mvc:annotation-driven/>
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="abcd.abcd.com"/>
<property name="port" value="2525"/>
<property name="username" value="admin@abcd.com"/>
<property name="password" value="test"/>
<property name="javaMailProperties">
<props>
<prop key="mail.transport.protocol">smtp</prop>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.debug">true</prop>
</props>
</property>
</bean>
我在初始化 JavaMailSender 时遇到空指针异常。(在这一行中 JavaMailSender mailSender = applicationContext.getBean("mailSender",JavaMailSenderImpl.class);)
堆栈跟踪:
java.lang.NullPointerException 在 com.patcyy.vamonos.utills.EmailUtility.sendSimpleMessage(EmailUtility.java:61) 在 com.patcyy.vamonos.services.StaticContentService.postEnquiry(StaticContentService.java:82) 在 com.patcyy.vamonos.controller.StaticContentController.postEnquiry(StaticContentController.java:143) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:891) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) 在 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:660) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:741) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:748)
我认为主要问题是您将实用程序定义为服务。 无论如何,如果你想在非托管对象中使用 Spring 托管 bean,你可以这样做
@Component public class ContextInitializer {
@Autowired
private JavaMailSender mailSender;
@PostConstruct
public void postConstruct() {
EmailUtility.setMailSender(mailSender);
}
}
并在 EmailUtility class 中添加一个 setter 方法 class。