使用 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。