0%

报错

各类框架工具报错

错误总结

线上问题

[[线上问题总结-茶颜供应链]]

Java基础

  1. 空指针异常 NullException
    • 场景
      1. 新增字段直接判断 newFiled == 1。应该 newFiled == null || newFiled == 1
      2. 查询外部接口返回了null

Java框架

Spring

AOP

Transactional事务失效
  1. 本类调用,不走代理。

    • 例子

      1
      2
      3
      4
      5
      6
      7
      8
      9
      public Result update User(User user, SubmitInfo submitInfo){
      UserDetail userDetail = buildUserDetail(user);
      this.updateUser(userDetail);
      }

      @Transactional
      public Result doUpdateUser(userDetail){

      }
    • 原因

      本类调用,不走代理。

      @Transactional 生效,需要走代理。

      走代理需要注入到spring容器中,并且他类调用

    • 解决

      新写一个类,或者自己注入自己

  2. 不在同一个线程中,如@Async导致失效。

  3. 手动抛出Exception,又没有指定回滚异常为Exception;spring只会在RunException和error回滚事务。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @Slf4j
    @Service
    public class UserService {

    @Transactional
    public void add(UserModel userModel) throws Exception {
    try {
    saveData(userModel);
    updateData(userModel);
    } catch (Exception e) {
    log.error(e.getMessage(), e);
    throw new Exception(e);
    }
    }
    }
  1. 多数据源,事务管理器不是默认名称,事务注解没有配置管理器名称

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // 事务管理器配置
    @Bean(name = "dataSourceTransactionManager3")
    public DataSourceTransactionManager mainTransactionManager(@Qualifier("dataSource3") DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
    }

    // 使用
    @Override
    @Transactional(rollbackFor = Exception.class,transactionManager = "dataSourceTransactionManager3")
    public int insert(){

    }
  2. 异常被吞了,没有手动回滚,或者再抛出异常

  3. 异常类型错误

参考

controller

@RequestParam

  • 问题

    调接口报错400

    1
    public Result<UserMatrixDTO> getUserByUserAndDept(@RequestParam(value = "userName") String userName, @RequestParam(value = "deptName",required = false) String deptName) {
  • 原因

    默认required = true。 不传时报400

  • 解决

    增加required = false

swagger knife4j

问题:接口文档请求异常

原因:响应的swagger的接口JSON是一个非法JSON。例如:后端给List集合的属性赋予了example属性

解决:List去除example属性

  • 问题

    swagger文档中响应参数显示错误

  • 原因

    @ApiModel(“”)中的值与其他值相同,swagger取了其他的@ApiModel注解得类

  • 例子

    有两个 @ApiModel(“测试”) 标注的类,swagger文档只会取其中一个

  • 解决

    改变其中一个 @ApiModel 中的值。

Junit

  • 问题

    junit启动报错,Caught exception while allowing TestExecutionListener

    Caught exception while allowing TestExecutionListener [org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@7582ff54] to prepare test instance [com.sexytea.pss.receiving.AutoCodeTest@2766ca9d]
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘com.sexytea.pss.receiving.AutoCodeTest’: Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘com.*.mapper.**Mapper

  • 原因

    *Mapper.java没有注解@Mapper时,报错。BootAppcation上有@MapperScan也没用

  • 例子

  • 解决

    Mapper.java类上添加注解@Mapper

mybatis

  1. 项目无法启动

    • 错误信息:Process finished with exit code 1

    • 代码环境

      1
      2
      3
      @MapperScan({"com.xiaoruiit.mapper.*"})
      xiaoruiit/mapper/manual 下有手动dao
      xiaoruiit/mapper 下有自动生成的dao
    • 原因:@Autowired 无法注入dao,报错

    • 排错

      Throwable抓报错

      1
      2
      3
      4
      5
      try {
      SpringApplication.run(BootApplication.class, args);
      }catch (Throwable e){
      e.printStackTrace();
      }
    • 解决:删除manual包

  2. mapper参数绑定异常

    • 错误信息

      本地idea启动没问题。

      容器中运行报错

      1
      org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'skuName' not found.
    • 代码

      1
      List<User> getReviewStockList(String userCode, String userName);
    • 解决

      1
      List<User> getReviewStockList(@Param("userCode")String userCode,@Param("userName")String userName);

Lombok

  • 问题:set、get报错,参数接不到

    image-20240124140400708

  • 原因:第二个字母大写的属性,lombok生成的get,set方法不符合java bean规范

  • 解决

    修改属性,或者手动生成set、get方法

BeanUtils

  • 问题

    springboot + mybatis分页插件 pageHelper不能正确的获取到total

  • 原因

    1
    BeanUtils复制List<bean>信息到List<beanVo>时丢失了PageInfo中的total信息
  • 解决

    第一种:直接查出为VO,不要转换;第二种:BeanUtils时,手写对PageInfo的total赋值。

Mysql

  1. order by 字段值为空,分页数据重复

    1
    2
    3
    order by diffMoney desc limit 0,10;
    order by diffMoney limit 10,10;
    diffMoney字段的值大部分为null,查出的部分分页数据会重复
    • 解决

      增加id排序字段

      1
      order by diffMoney desc, id desc limit 10,10;

日志SLS

  1. 无法识别中文符号”:”

    1
    2
    3
    日志是  创建消息:
    创建消息 查不到,需要查 创建消息:
    如果是 创建消息:, 创建消息可以查到
  2. IDEA

    Cannot resolve class or package

  • 问题描述

    Cannot resolve class or package ‘jspxcms’,即找不到包jspxcms

  • 原因

    改变了目录结构

    image-20240124115720268

  • 解决

    恢复目录结构

    image-20240124115804575

Http

  • 问题

  • 原因

  • 解决

逻辑

未分页

  • 问题:接口报错

  • 原因:未分页多次循环调用Feign来组装数据,hystrix起作用。

  • 实例

    未分页调用薪资配置list接口,7000多条数据用Feign远程调用MdmUserService组装员工基本数据。

  • 解决

github

无法推送

  • 背景

    配置了github ssh key 和本地key

  • 问题

    一直都成功,某次推送,idea报错:ssh: connect to host github.com port 22: Connection timed out

  • 解决

    C:\Users\LENOVO.ssh 增加文件 config

    内容:

    1
    2
    3
    4
    5
    6
    Host github.com
    User git
    Hostname ssh.github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa
    Port 443
  • 参考
    https://blog.csdn.net/weixin_45637036/article/details/106560217

其他问题

UAT环境不可用

  • 问题描述

需验证生产问题时

  1. 发现鸳央登录后点击供应链内容提示无法登录。
  2. 发现茶颜登录后,点击供应链内容无反应。
  3. PDA无法登录
  • 事件发展:

  • 排查

    PDA

    1. 查日志,有报错。重发服务
    2. 重发服务后,只有心跳日志,接口日志。想起半个月前环境迁移,可能没配置路由
    3. 容器配置检查路由,缺少路由,配置路由。依然无接口日志
    4. 抓包到报错的接口,是钉钉扫码接口报错,前端本地调试可以登录,随即发现uat环境迁移,域名改变,即钉钉回调地址发生变化。改变回调地址,重新打包。

    IPAD

    1. 抓包,请求到固定域名 uat.baidu.com,但返回404
    2. 找前端改nginx中uat配置的后端地址并发版时,发现流水线配置没有改集群地址。
  • 具体问题点

  1. 容器缺少服务配置
  2. 容器缺少路由配置
  3. 部分服务配置错误
  4. pda未切换域名
  5. iPad未切换域名
  6. 部分服务未切换数据库
  7. 前端流水线配置没有选新的集群地址
  • 知识
  1. 服务(svc)配置影响内部互相调用。
  2. 路由ingress配置影响外部访问。入口服务必须配置,一般配置映射到80端口。其他服务不配置时,接口文档无法访问。
  3. 需要DNS配置
  4. nginx和后端服务同在阿里云集群,nginx配置了后端服务名,test-svc
  • 复杂性:
    1. 我手里有定好排期的开发任务
    2. 我不知道整个链路,没人知道整个链路
    3. 没有人知道整个链路
    4. 事件已发生一段时间,相关人员忘记了东西
    5. 相关人员多。前端两位,其中以为是另一个组的;后端5位,各自服务未改数据库地址;运维一位,不是专职,还会做别的事;测试两位,其中一位做了部分容器配置;领导,忘了之前的配置;
    6. 没有prod权限对照检查,uat环境与其他配置不同