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");
}
}
Springでは、Springのスコープ外で新しいインスタンスを作成しない限り、 '@ Autowired'フィールドは決して' null'になりません。スプリングがフィールドを自動配線できない場合は、起動に失敗します。また、ここに示すコードには '27'という行はありません。 –
'RedisSubscriber'をどのように取得したら' MessageListenerAdapter'でそれを登録するのかコードを投稿できますか?あなたが自分自身をインスタンス化しているように見えます。 – mp911de