2017-07-12 14 views
0

Redisからの購読メッセージの後、トピック/topic/roomにメッセージを送信しようとしています。 私のコードは以下のとおりです。NullPointerException:Springブートでwebsocket経由でMessageListenerからクライアントに送信できません。

@Component 
public class RedisSubscriber implements MessageListener { 

    static private Logger log = Logger.getLogger(RedisSubscriber.class.getName()); 

    @Autowired 
    private SimpMessagingTemplate template; 

    @Override 
    public void onMessage(final Message message, final byte[] pattern) { 

     log.info("template: " + template); 
     template.convertAndSend("/topic/room", message); 
     log.info("Message send: " + message.toString()); 
    } 
} 

結果は以下のとおりです。 なぜオブジェクトがnullであるかわかりません。 SimpMessagingTemplateが@Autowiredではないようです。 他のテンプレートを作成する必要がありますか? 私に助言してください。例外

2017-07-12 19:53:24.920 INFO 8724 --- [edisContainer-2] j.c.t.l.delivery.redis.RedisSubscriber : template: null 
2017-07-12 19:53:24.939 ERROR 8724 --- [edisContainer-2] o.s.d.r.l.a.MessageListenerAdapter  : Listener execution failed 

java.lang.NullPointerException: null 
    at XXXX.redis.RedisSubscriber.onMessage(RedisSubscriber.java:27) ~[classes/:na] 
    at org.springframework.data.redis.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:299) ~[spring-data-redis-1.8.4.RELEASE.jar:na] 
    at org.springframework.data.redis.listener.RedisMessageListenerContainer.executeListener(RedisMessageListenerContainer.java:249) [spring-data-redis-1.8.4.RELEASE.jar:na] 
    at org.springframework.data.redis.listener.RedisMessageListenerContainer.processMessage(RedisMessageListenerContainer.java:239) [spring-data-redis-1.8.4.RELEASE.jar:na] 
    at org.springframework.data.redis.listener.RedisMessageListenerContainer$1.run(RedisMessageListenerContainer.java:967) [spring-data-redis-1.8.4.RELEASE.jar:na] 
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131] 

addtionalのINFOMATION次

ガット

は以下の通りです。 これは MessageListenerAdapterで登録するために RedisSubscriberを取得する方法です。

@Configuration 
@EnableScheduling 
public class AppConfig { 

    @Bean 
    JedisConnectionFactory jedisConnectionFactory() { 
     return new JedisConnectionFactory(); 
    } 

    @Bean 
    RedisTemplate<String, Object> redisTemplate() { 
     final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); 
     template.setConnectionFactory(jedisConnectionFactory()); 
     template.setKeySerializer(new StringRedisSerializer()); 
     template.setHashValueSerializer(new GenericToStringSerializer<Object>(Object.class)); 
     template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class)); 
     return template; 
    } 

    @Bean 
    MessageListenerAdapter messageListener() { 
     return new MessageListenerAdapter(new RedisSubscriber()); 
    } 

    @Bean 
    RedisMessageListenerContainer redisContainer() { 
     final RedisMessageListenerContainer container = new RedisMessageListenerContainer(); 

     container.setConnectionFactory(jedisConnectionFactory()); 
     container.addMessageListener(messageListener(), topic()); 

     return container; 
    } 

    @Bean 
    RedisPublisher redisPublisher() { 
     return new RedisPublisher(redisTemplate(), topic()); 
    } 

    @Bean 
    ChannelTopic topic() { 
     return new ChannelTopic("topic"); 
    } 
} 
+0

Springでは、Springのスコープ外で新しいインスタンスを作成しない限り、 '@ Autowired'フィールドは決して' null'になりません。スプリングがフィールドを自動配線できない場合は、起動に失敗します。また、ここに示すコードには '27'という行はありません。 –

+0

'RedisSubscriber'をどのように取得したら' MessageListenerAdapter'でそれを登録するのかコードを投稿できますか?あなたが自分自身をインスタンス化しているように見えます。 – mp911de

答えて

1

問題は解決されました。 次のコードを使用しています。 私はRedisSubscriberクラスの代わりにをAppConfigクラスに記載しました。

@Configuration 
@EnableScheduling 
public class AppConfig { 

    @Autowired         <- Add 
    private SimpMessagingTemplate template;  <- Add 

public class RedisSubscriber implements MessageListener { 

    static private Logger log = Logger.getLogger(RedisSubscriber.class.getName()); 
    private final SimpMessagingTemplate template;          <- Add 

    public RedisSubscriber(final SimpMessagingTemplate template) {      <- Add 
     this.template = template;               <- Add 
    }                      <- Add 

    @Override 
    public void onMessage(final Message message, final byte[] pattern) { 

アドバイスをいただき、ありがとうございます。

関連する問題