Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NullPointerException:无法使用Spring引导通过websocket从MessageListener发送到客户端_Java_Spring Boot_Websocket_Redis - Fatal编程技术网

Java NullPointerException:无法使用Spring引导通过websocket从MessageListener发送到客户端

Java NullPointerException:无法使用Spring引导通过websocket从MessageListener发送到客户端,java,spring-boot,websocket,redis,Java,Spring Boot,Websocket,Redis,从Redis订阅消息后,我正试图将消息发送到topic/topic/room。 我的代码如下 @Component public class RedisSubscriber implements MessageListener { static private Logger log = Logger.getLogger(RedisSubscriber.class.getName()); @Autowired private SimpMessagingTemplate

从Redis订阅消息后,我正试图将消息发送到topic
/topic/room
。 我的代码如下

@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());
    }
}
结果如下。 我不知道为什么
SimpMessagingTemplate
对象为空。 SimpMessageTemplate似乎不是
@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]
其他信息如下。 这就是我获取RedisSubscriber的方式,以便在
MessageListenerAdapter
中注册它

@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");
    }
}
@配置
@使能调度
公共类AppConfig{
@豆子
绝地连接工厂绝地连接工厂(){
返回新的JedisConnectionFactory();
}
@豆子
RedisTemplate RedisTemplate(){
最终RedisTemplate=新RedisTemplate();
setConnectionFactory(jedisConnectionFactory());
setKeySerializer(新的StringRedisSerializer());
setHashValueSerializer(新的GenericToStringSerializer(Object.class));
setValueSerializer(新的GenericToStringSerializer(Object.class));
返回模板;
}
@豆子
MessageListenerAdapter messageListener(){
返回新的MessageListenerAdapter(new RedisSubscriber());
}
@豆子
RedisMessageListenerContainer redisContainer(){
最终RedisMessageListenerContainer容器=新的RedisMessageListenerContainer();
container.setConnectionFactory(jedisConnectionFactory());
addMessageListener(messageListener(),topic());
返回容器;
}
@豆子
RedisPublisher RedisPublisher(){
返回新的RedisPublisher(redisTemplate(),topic());
}
@豆子
ChannelTopic主题(){
返回新的频道主题(“主题”);
}
}

问题已经解决。 现在它正在使用以下代码。 我确实在
AppConfig
类上声明了
SimpMessagingTemplate
,而不是
RedisSubscriber

@Configuration
@EnableScheduling
public class AppConfig {

    @Autowired                                  <- Add
    private SimpMessagingTemplate template;     <- Add
@配置
@使能调度
公共类AppConfig{

@自动连线在AppConfig中,您可以自动连线您的订阅者

@配置
@使能调度
公共类AppConfig{
@自动连线
再分配订户再分配订户
@豆子
MessageListenerAdapter messageListener(){
返回新的MessageListenerAdapter(redisSubscriber);
}
}
如果您的订阅服务器带有@Service注释,则可以在订阅服务器类内自动连接服务:

@服务
公共类Redisuber实现MessageListener{
@自动连线
私有SimpMessageTemplate//应为非null
}

基本上在Spring中,
@Autowired
字段可以/永远不会为
null
,除非您自己在Spring的范围之外创建新实例。如果Spring无法自动连接字段,它将无法启动。此外,您在此处显示的代码中没有任何行
27
。您可以发布代码如何获得
RedisSubscr吗iber
MessageListenerAdapter
中注册它?看起来您自己在实例化它。您在RedisSubscriber中添加了一个默认构造函数
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) {