Spring-Boot @Autowired in main class gets null

I want to connect to the Sonic Broker Topic and listen to any incoming XML message. I did something like below;

Application.java

@SpringBootApplication @ComponentScan({"com.mainpack", "com.msgpack.jms"}) @EnableJms public class Application extends SpringBootServletInitializer { @Autowired private JmsTopicListener jmsTopicListener; @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } @Override public void onStartup(final ServletContext servletContext) throws ServletException { try { LogService.info(Application.class.getName(), "Starting Service..."); super.onStartup(servletContext); jmsTopicListener.listenMessage(); LogService.info(Application.class.getName(), "Service Started"); } catch (Exception ex) { LogService.error(this.getClass().getName(), ex); } } public static void main(String[] args) { ApplicationContext context = SpringApplication.run(Application.class, args); LogService.info(Application.class.getName(), "Service Started..."); } } 

JmsTopicListener.java

 @Component public class JmsTopicListener { @Autowired private ApplicationProperties properties; @Autowired private MsgListener msgListener; public void listenMessage() { TopicConnectionFactory factory; TopicConnection connection = null; LogService.info(this.getClass().getName(), "Registering Broker Connection"); try { factory = new progress.message.jclient.TopicConnectionFactory(properties.getBrokerURL()); connection = factory.createTopicConnection(properties.getUserName(), properties.getPass()); javax.jms.TopicSession subSession = (TopicSession) connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); javax.jms.Topic topic = subSession.createTopic(properties.getTopicName()); MessageConsumer subscriber = subSession.createSubscriber(topic); subscriber.setMessageListener(msgListener); connection.start(); LogService.info(this.getClass().getName(), "Broker connected"); } catch (Exception ex) { LogService.error(this.getClass().getName(), ex); } } } 

Msglistist.java

 @Component public class MsgListener implements MessageListener { @Override public void onMessage(Message msg) { if (msg instanceof XMLMessage) { try { XMLMessage m = (XMLMessage) msg; if (m.getText().contains("Applications")) { LogService.info(this.getClass().getName(), "Recieved A Applications Message"); } else { LogService.info(this.getClass().getName(), "Recieved Message Does not contain Applications Tag"); } } catch (Exception ex) { LogService.info(this.getClass().getName(), "Exception: " + ex.getMessage()); } } } } 

When I run this code, I get nullPointer in the jmsTopicListener.listenMessage() in Application.java .

What mistake did I make here? Is there a way I can improve this (I mean that the work is done in less code)?

NOTE. com.mainpack has classes Application.java and ApplicationProp.java com.msgpack.jms have JmsTopicListener.java and MsgListner.java

Error from the registrar:

 ERROR [2015-07-14 14:34:52] [com.mainpack.Application] [localhost-startStop-1] - [Exception: ]java.lang.NullPointerException at com.mainpack.Application.onStartup(Application.java:33) at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:175) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5156) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:945) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1768) at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) 
+6
source share
1 answer

onStartup is called by the servlet container at the very beginning of the application life cycle and is called by an instance of the class created by the servlet container, not Spring Boot. This is why jmsTopicListener null .

Instead of overriding onStartup , you can use a method annotated with @PostConstruct . It will be called by Spring after creating the Application instance and injecting any dependencies:

 @SpringBootApplication @ComponentScan({"com.mainpack", "com.msgpack.jms"}) @EnableJms public class Application extends SpringBootServletInitializer { @Autowired private JmsTopicListener jmsTopicListener; @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } @PostConstruct public void listen() { jmsTopicListener.listenMessage(); } public static void main(String[] args) { ApplicationContext context = SpringApplication.run(Application.class, args); LogService.info(Application.class.getName(), "Service Started..."); } } 
+12
source

All Articles