这里的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,所以为空,检查一下看看