0

私は、約 5 年間の .NET 経験の後、Java に戻る開発者です。MVC フレームワークの知識はありますが、Spring MVC と Spring フレームワークについてはまったくの初心者です。

activemq JMS キューにエンティティを保存する予定の割り当てがあります。より複雑なオブジェクトを送信する前に、まず単純な TextMessage で試してみることにしました。ビューの入力ボタン コントロールにマップされたコントローラーから送信を試みるたびに、Tomcat で java.lang.NullPointerException が発生します。それ以外の情報はあまり表示されません。ソースが ApiMessageSender クラスのこのコード行からのものであることを示しているだけです。

jmsTemplate.send(new MessageCreator(){  

        @Override  
        public Message createMessage(Session session) throws JMSException {  
            return session.createTextMessage(message);  
        }  
    });  

Spring Web mvc Web アプリケーション内の実装は、3 つのクラスで構成されています。1) ApiMessageSender.java

import javax.jms.*;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.jms.core.JmsTemplate;  
import org.springframework.jms.core.MessageCreator;  
import org.springframework.stereotype.Component;  

@Component("messageSender")  
public class ApiMessageSender {  
@Autowired  
private JmsTemplate jmsTemplate;  
public void sendMessage(final String message){  
    jmsTemplate.send(new MessageCreator(){  

        @Override  
        public Message createMessage(Session session) throws JMSException {  
            return session.createTextMessage(message);  
        }  
    });  
}  
}  

2) Spring IoC 配管が行われる WebAppConfig.java。このクラスは、このプロジェクトではまったく使用されない ApplicationContext.xml ファイルの代わりになります。キュー名は、アプリケーションを実行する前に、ActiveMQ 管理 Web インターフェイスから手動で作成されました。

@Bean
    public org.apache.activemq.ActiveMQConnectionFactory connectionFactory() {
        org.apache.activemq.ActiveMQConnectionFactory connectionFactory = new org.apache.activemq.ActiveMQConnectionFactory();
        connectionFactory.setBrokerURL("tcp://localhost:61616");
        return connectionFactory;
    }

    @Bean
    public org.springframework.jms.core.JmsTemplate jmsTemplate() {
        org.springframework.jms.core.JmsTemplate jmsTemplate = new org.springframework.jms.core.JmsTemplate(connectionFactory());
        jmsTemplate.setDefaultDestinationName("apiqueue");
        return jmsTemplate;
    }

3) ApiController.java

ビューでボタンがクリックされたときに呼び出される、コントローラー内のこのアクション メソッド。他の要件に進むことができるように、特定のコード スニペットをコメントアウトしました。

@RequestMapping(value="/create", method=RequestMethod.POST)
    public ModelAndView createNewApi(@ModelAttribute @Valid Api api,
            BindingResult result,
            final RedirectAttributes redirectAttributes) {

        if (result.hasErrors())
            return new ModelAndView("api-new");

        ModelAndView mav = new ModelAndView();
        String message = "New api "+api.getApiKey()+" was successfully created.";

        apiService.create(api);

        //Send object to Queue.
        /*GenericXmlApplicationContext ctx=new GenericXmlApplicationContext();  
        ctx.load("classpath:applicationContext.xml");  
        ctx.refresh();*/  

       /* ApiMessageSender sender = new ApiMessageSender();  
        sender.sendMessage("hello jms3");*/
        //ctx.close();
        //End of messaging task. The message should be successfully in the JMS Queue.

        mav.setViewName("redirect:/api/list.html");

        redirectAttributes.addFlashAttribute("message", message);   
        return mav;     
    }

ここで何が問題になる可能性がありますか?ここで java.lang.NullPointerException が発生するのはなぜですか? どうすればこれを機能させることができますか? どうもありがとうございました。

4

1 に答える 1