Reputation: 15
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)
Upvotes: 0
Views: 2014
Reputation: 251
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.
Upvotes: 0