0

I am trying to do email functionality (For my learning purpose)using spring. Here is the code snippets:

@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);
}

}

My application context :

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

I am getting nullpointer exception while initializing JavaMailSender.(In this line JavaMailSender mailSender = applicationContext.getBean("mailSender",JavaMailSenderImpl.class);)

StackTrace :

java.lang.NullPointerException at com.patcyy.vamonos.utills.EmailUtility.sendSimpleMessage(EmailUtility.java:61) at com.patcyy.vamonos.services.StaticContentService.postEnquiry(StaticContentService.java:82) at com.patcyy.vamonos.controller.StaticContentController.postEnquiry(StaticContentController.java:143) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:891) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877) at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)

2
  • I am completely new to Spring..Please let me know if I am doing anything wrong. Commented Oct 7, 2018 at 1:57
  • 2
    As you can imagine, it's virtually impossible for us to tell which line of code in what you posted is line 61. But that's where the stack trace says the null pointer is. You could use your debugger, put a breakpoint at line 61, and figure out what is null and causing the NPE. Then, if you can't figure out why, let us know which line it is, and maybe we can help you to figure it out. Commented Oct 7, 2018 at 2:50

1 Answer 1

0

I think the main problem is that you're defining as utility something that is a service. Anyway, if you want to use a Spring managed bean in not managed object you can do something like this

@Component public class ContextInitializer {

@Autowired
private JavaMailSender mailSender;

@PostConstruct
public void postConstruct() {
    EmailUtility.setMailSender(mailSender);
}

}

and add a setter method in EmailUtility class.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.