使用@Autowired对象为null

这里的redisUtil为什么没有注入进来,一直为Null,但是在其他类中就可以正常注入?


@ServerEndpoint("/websocket/{userId}")
@Component
public class WebSocketServer {
    
    @Autowired
    private RedisUtil redisUtil;

    private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);

    /**
     * 当前在线连接数
     */
    private static AtomicInteger onlineCount = new AtomicInteger(0);

    /**
     * 用来存放每个客户端对应的 WebSocketServer 对象
     */
    private static ConcurrentHashMap<String, WebSocketServer> webSocketMap = new ConcurrentHashMap<>();

    /**
     * 与某个客户端的连接会话,需要通过它来给客户端发送数据
     */
    private Session session;

    /**
     * 接收 userId
     */
    private String userId = "";

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        this.session = session;
        this.userId = userId;
        if (webSocketMap.containsKey(userId)) {
            webSocketMap.remove(userId);
            webSocketMap.put(userId, this);
        } else {
            webSocketMap.put(userId, this);
            addOnlineCount();
        }
        log.info("用户连接:" + userId + ",当前在线人数为:" + getOnlineCount());
        redisUtil.set("online",getOnlineCount());
        try {
            sendMessage("连接成功!");
        } catch (IOException e) {
            log.error("用户:" + userId + ",网络异常!!!!!!");
        }
    }
}

RedisUtil 代码

@Component("redisUtil")
public class RedisUtil {

    @Autowired
    @Qualifier("redisTemplate")
    private RedisTemplate redisTemplate;
}

RedisConfig 代码

@Configuration
public class RedisConfig {
    @Bean("redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //默认配置为了方便写成<String, Object>
        RedisTemplate<String, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        //Json序列化
        Jackson2JsonRedisSerializer<Object> objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        /*该漏洞是由于Jackson框架enableDefaultTyping方法存在Java反序列化代码执行漏洞,
        攻击者利用漏洞可在服务器主机上执行任意代码或系统指令,取得网站服务器的控制权。
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);*/
        //替代方法activateDefaultTyping
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance ,
                ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);

        //序列化String
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        //key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        //hash的key也采用String的的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        //value采用json的序列化方式
        template.setValueSerializer(objectJackson2JsonRedisSerializer);
        //hash的value采用json的的序列化方式
        template.setHashValueSerializer(objectJackson2JsonRedisSerializer);
        //非spring注入使用RedisTemplate,需先调用afterPropertiesSet()方法
        template.afterPropertiesSet();
        return template;
    }
}


依赖注入配置问题:确保被注入的对象在Spring容器中正确配置。检查是否在Spring的配置文件中声明了该对象的bean,并且使用了@Component、@Service、@Repository等注解进行标记。

扫描包配置问题:确认Spring容器能够正确扫描到被注入对象所在的包。检查包扫描配置是否包含了被注入对象所在的包,或者使用@ComponentScan注解明确指定扫描的包。

类路径扫描问题:确保被注入对象的类路径正确配置。检查依赖的类是否在类路径下可访问。

循环依赖问题:避免出现循环依赖的情况,即A依赖B,而B又依赖A。这可能导致注入失败。尽量避免循环依赖,或者考虑通过构造函数注入来解决。

版本冲突问题:检查所使用的依赖库的版本是否兼容。不同版本的依赖库可能存在冲突,导致注入失败。

Spring容器初始化问题:检查Spring容器的初始化过程是否正常。可能是因为配置问题或其他异常导致Spring容器未能正确初始化。

注解使用错误:确保使用的注解正确,如@Autowired或@Inject。检查注解是否放在了正确的位置,例如属性、构造函数或Setter方法上。

你的RedisUtil所在的程序包,是不是不在你的@ComponentScan 注解的路径里,导致没有加载RedisUtil这个bean,所以为空,检查一下看看