Springboot注入是null

我在项目中遇到一个问题:一个叫做WebSocketServer的类中注入一个RedisUtil工具类且WebSocketServer类有一个静态方法, 该类的静态方法调用该RedisUtil工具类的方法出现空指针,

WebSocketServer代码如下:

import cn.hutool.core.codec.Base64;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import com.okancha.constant.commonresultcode.CommonResultCode;
import com.okancha.utils.JWTUtil;
import com.okancha.utils.redis.RedisUtil;
import java.io.IOException;
import java.util.Date;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.TimeUnit;
import javax.annotation.PostConstruct;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


@ServerEndpoint("/websocket/{token}")
@Component
public class WebSocketServer {

  @Autowired
  private RedisUtil redisUtil;

  private static RedisUtil RedisUtilStatic;

  @PostConstruct
  public void init() {
    RedisUtilStatic = redisUtil;
  }


  static Log log = LogFactory.get(WebSocketServer.class);

  //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
  private static int onlineCount = 0;

  //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
  private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();

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

  //接收userCode
  private String userCode = null;

  /**
   * 连接建立成功调用的方法
   */
  @OnOpen
  public void onOpen(Session session, @PathParam("token") String token) {

    // 解密token
    String userCode = JWTUtil.getAppUID(token);
    if (StringUtils.isBlank(userCode)) {
      log.error("用户token被串改过了");
      return;
    }

    this.session = session;
    webSocketSet.add(this);     //加入set中
    addOnlineCount();           //在线数加1
    log.info("有新窗口开始监听userCode: " + userCode + ",当前在线人数为" + getOnlineCount());
    this.userCode = userCode;
    try {
      sendMessage("连接成功");
    } catch (IOException e) {
      log.error("websocket IO异常");
    }
  }


  /**
   * 收到客户端消息后调用的方法
   *
   * @param message 客户端发送过来的消息
   */
  @OnMessage
  public void onMessage(String message, Session session) {

    // 这里可以处理客户端的用户发送过来的信息message
    log.info("收到来自客户端的用户userCode: " + userCode + "的信息: " + message);

    for (WebSocketServer item : webSocketSet) {
      item.sendInfo(userCode, item);
    }
  }


  /**
   * 群发自定义消息
   */
  public static void sendInfo(String userCode, WebSocketServer item) {

    try {

      if (userCode.equals(item.userCode)) { // 如果是当前的用户的,那么就生成有效期只有一分钟的二维码

        String timeStr = new Date().getTime() + StringUtils.EMPTY;

        // 生成二维码
        QrConfig config = new QrConfig(300, 300);
        config.setMargin(2);
        byte[] date = QrCodeUtil.generatePng(Base64.encode(timeStr), config);

        // 把二维码变成base64
        String encode = Base64.encode(date);

        // 发送数据
        item.sendMessage(encode);
        // 保存在redis中,有效期是一分钟
        RedisUtilStatic.setEx(CommonResultCode.BOOK_BAR_TEMPORARY_QRCODE + userCode, timeStr, 1, TimeUnit.MINUTES);
        log.info("推送消息到userCode: " + item.userCode + ",推送内容:" + encode);
      }

    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  /**
   * 实现服务器主动推送
   */
  public void sendMessage(String message) throws IOException {
    this.session.getBasicRemote().sendText(message);
  }

  /**
   * 连接关闭调用的方法
   */
  @OnClose
  public void onClose() {
    webSocketSet.remove(this);  //从set中删除
    subOnlineCount();           //在线数减1
    log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
  }

  /**
   *
   * @param session
   * @param error
   */
  @OnError
  public void onError(Session session, Throwable error) {
    log.error("发生错误");
    error.printStackTrace();
  }

  public static synchronized int getOnlineCount() {
    return onlineCount;
  }

  public static synchronized void addOnlineCount() {
    WebSocketServer.onlineCount++;
  }

  public static synchronized void subOnlineCount() {
    WebSocketServer.onlineCount--;
  }
}

上面的代码可以看到静态方法sendInfo调用RedisUtil工具类的方法, 刚开始的时候出现了redisUtil是null的情况,后来只需要这样配置就对了,代码如下:

@Autowired
  private RedisUtil redisUtil;

  private static RedisUtil RedisUtilStatic;

  @PostConstruct
  public void init() {
    RedisUtilStatic = redisUtil;
  }

配置完以后就不会出现空指针啦

如果你想看到我的RedisUtil工具类是怎么写的,详情看:

https://blog.youkuaiyun.com/qq_26106607/article/details/102307615

 

 

### 解决Spring Boot中MyBatis Mapper注入Null的问题 在开发基于Spring Boot的应用程序时,遇到Mapper接口注入失败的情况通常是因为配置不正确或缺少必要的依赖项。以下是几种常见的解决方案: #### 1. 使用`@MapperScan` 如果项目结构较为复杂或者存在多个包路径,则可以在启动类上使用`@MapperScan`注解来指定扫描的包位置。 ```java import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.example.mapper") // 替换为实际的mapper接口所在的包名 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 此方法可以确保所有的Mapper接口都被自动识别并注册到Spring容器内[^1]。 #### 2. 添加`@Component` 或 `@Repository` 对于某些特殊情况下的Mapper实现类(并非通过XML定义),可以直接在其上加上`@Component`或`@Repository`注解使其成为Spring管理的Bean对象。 ```java package com.example.mapper; import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Repository; @Repository public interface UserMapper { @Select("SELECT * FROM users WHERE id=#{id}") User findById(Integer id); } ``` 这种方式适用于小型应用或是测试环境中的快速验证。 #### 3. 配置文件设置 确认application.properties或application.yml中有正确的数据库连接以及mybatis的相关配置信息,比如: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC username: root password: 123456 mybatis: type-aliases-package: com.example.model # 实体类所在的位置 mapper-locations: classpath*:mappers/*.xml # 映射文件(.xml)存放目录 ``` 这些配置能够帮助框架找到对应的资源文件,并完成映射关系建立的工作。 #### 4. 检查依赖版本兼容性 有时不同版本之间的差异也会引起此类问题的发生。建议查看项目的pom.xml或其他构建工具配置文件,保证所使用的Spring Boot、MyBatis及其扩展库之间保持良好的兼容性。 ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> <!-- 确认该版本与当前使用的Spring Boot相匹配 --> </dependency> ``` 以上措施有助于排查和修复Spring Boot应用程序中关于MyBatis Mapper无法正常注入的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值