springboot2结合websocket时为何ChannelInterceptorAdapter无法注入bean?

package com.qky.qingchi.config;

import com.qky.qingchi.config.filter.UserMessageInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/queue", "/topic");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/webSocketServer").setAllowedOrigins("*").withSockJS();
    }

    /**
     * 配置客户端入站通道拦截器
     */
    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(new UserMessageInterceptor());
    }
}
package com.qky.qingchi.config.filter;

import com.qky.qingchi.config.websocket.WebSocketUser;
import com.qky.qingchi.util.TokenUtils;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.simp.stomp.StompCommand;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.messaging.support.ChannelInterceptorAdapter;
import org.springframework.messaging.support.MessageHeaderAccessor;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component
public class UserMessageInterceptor extends ChannelInterceptorAdapter {

    @Resource
    private RedisMessageListenerContainer redisContainer;

    @Resource
    private RedisConnectionFactory connectionFactory;

    @Resource
    private MessageListenerAdapter messageListener;

    @Resource
    private ChannelTopic topic;

    @Resource
    private String qkyname;

    /**
     * 获取包含在stomp中的用户信息
     */
    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        StompHeaderAccessor accessor =
                MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
        System.out.println(accessor.getLogin());
        System.out.println(accessor.getCommand());
        System.out.println("-----------------------");
        System.out.println(redisContainer);
        System.out.println(messageListener);
        System.out.println(topic);
        System.out.println(qkyname);
        System.out.println("-----------------------");
        System.out.println("触发websocket连接");
        //1. 判断是否首次连接请求
        if (StompCommand.CONNECT.equals(accessor.getCommand())) {
            //2. 验证是否登录
            String token = accessor.getNativeHeader("token").get(0);
            System.out.println(token);
            if (TokenUtils.isCorrect(token)) {
                String phoneNumber = TokenUtils.getPhoneNumByToken(token);
                accessor.setUser(new WebSocketUser(phoneNumber));
            /*    RedisMessageListenerContainer container = new RedisMessageListenerContainer();
                container.setConnectionFactory(connectionFactory);
                container.addMessageListener(messageListener, new ChannelTopic(phoneNumber));*/
                return message;
            } else {
                return null;
            }
        }
        //不是首次连接,已经成功登陆
        return message;
    }
}
package com.qky.qingchi.config.redis;

import com.qky.qingchi.util.UserUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.messaging.simp.SimpMessagingTemplate;

import javax.annotation.Resource;

@Configuration
public class RedisSubListenerConfig {

    @Resource
    private SimpMessagingTemplate messagingTemplate;

    @Bean
    MessageListenerAdapter messageListener() {
        //abstract methods overwrite
        return new MessageListenerAdapter((MessageListener) (message, pattern) -> {
            System.out.println("Message received: " + message.toString());
            //message中带user信息,然后根据user推送message
//            replyUser.getUsername()
            messagingTemplate.convertAndSendToUser(UserUtils.getUser().getPhoneNum(), "/queue/notifications", message);
        });
    }

    @Bean
    RedisMessageListenerContainer redisContainer(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container
                = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(messageListener(), topic());
        return container;
    }

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

    @Bean("qkyname")
    public String qkyname() {
        System.out.println("注册秦开远名字bean");
        return "qinkaiyuan";
    }
}

注入的内容在其他类都是可以获得的,就在这个类里面无法获取,这是为什么啊

阅读 4.4k
1 个回答

找到问题了,因为UserMessageInterceptor是我自己new出来的,不是spring管理的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题