【已解决】遇到了关于MybatisPlus一个奇怪的报错,佬们帮忙看看

框架:SpringBoot 2.4.2 Mybatis-Plus 3.4.0 Gson 2.8.6

代码如下:

    @Test
    public void test() {
        LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SysUser::getEmail, "112@qq.com");
        SysUser user = sysUserService.getOne(wrapper);
        System.out.println(user);
    }

运行了之后报 OOM 异常

有个AOP拦截器记录Log操作日志
代码如下:

@Aspect
@Slf4j
@Component
@ConditionalOnProperty(name = {"log.aspect.enable"}, havingValue = "true", matchIfMissing = true)
public class LogAspect {

    @Pointcut("execution(* com.bmy.*.controller.*Controller.*(..)) || execution(* com.bmy.*.service.*Service.*(..))")
    private void pointCut() {
    }

    @Around("pointCut()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        Object[] reqArgs = pjp.getArgs();
        String req = new Gson().toJson(reqArgs);
        MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
        String methodName = methodSignature.getDeclaringType().getName() + "." + methodSignature.getName();
        log.info("{},dto:{}", methodName, req);
        Long startTime = System.currentTimeMillis();
        Object responseObj = pjp.proceed();
        String resp = new Gson().toJson(responseObj);
        Long endTime = System.currentTimeMillis();
        log.info("{},response:{},costTime:{}", methodName, resp, endTime - startTime);
        return responseObj;
    }
}

后面用Mybatis Plus 的mapper查询 又没报错

Service代码

public interface SysUserService extends IService<SysUser> {

    PageResponse<SysUserVO> queryByPage(UserPageDTO userPageDTO);
}

Mapper代码

public interface SysUserMapper extends BaseMapper<SysUser> {
    /**
     * 查询指定行数据
     *
     * @param sysUser
     * @param pageStart
     * @param pageSize
     * @return
     */
    List<SysUser> queryAllByLimit(@Param("po") SysUser sysUser, @Param("pageStart") Long pageStart, @Param("pageSize") Long pageSize);
}

佬们帮忙看看,有没有什么排查的思路?

已解决了 感谢各位佬的帮助

和MybatisPlus有什么关系

报错放全的上看看,看看最外层是哪里报错,debug看看。
你的aop能切到你这个test?

这报错也没有和 mybatis plus 相关的啊

看日志不是你那个AOP报错的吗,debug看一下呗

用MybatisPlus mapper 查就没报错

断点打了 没进到gson那块代码 就报OOM了

看看你的SysUser结构是怎么样的?是不是有复杂结构在里面?

@Data
@TableName(value = "sys_user")
public class SysUser extends BaseEntity {
    /**
     * ID
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 用户名
     */
    private String username;

    /**
     * 密码
     */
    private String password;

    /**
     * 昵称
     */
    private String nickname;

    /**
     * 头像
     */
    private String avatarUrl;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 性别 0 男 1女
     */
    private Integer gender;

    /**
     * 手机号
     */
    private String phone;

    /**
     * 电子邮箱
     */
    private String email;

    /**
     * 角色 0普通用户 1会员 2管理员
     */
    private Integer userRole;

    /**
     * 用户状态 0正常 1封号
     */
    private Integer userStatus;

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
@Data
public class BaseEntity implements Serializable {

    private static final long serialVersionUID = -731231159105093239L;

    @TableField(fill = FieldFill.INSERT)
    private String createBy;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    @TableLogic
    @TableField(fill = FieldFill.INSERT)
    private Integer deleteFlag;

    @Version
    @TableField(fill = FieldFill.INSERT)
    private Integer version;
}

image

这一行报错?

这种别人光肉眼看代码,要是之前没遇到过。很难看出来

去掉aop功能看还报不报

断点了这里 debug没 进到这里来就报oom了

不行你把gson换掉,用fastjson,或者自带的ObjectMapper看看还会不会报错。

没执行?从你这个aop看,其他地方没有调用的gson啊,把你报错的日志全贴出来看看吧

递归了,开辟的栈帧太深了,gson的bug
去github去看看,也许别人也遇到了


这里去debug


上一年别人就发生了

看实体好像也没有JPA那套ManytoOne。。那么怎么栈根循环了?

JPA以前倒是会碰到两个Entity,里面维护了关系OneToMany和ManyToOne

toString的时候,反复调用

错误信息发全

以前碰过一个一样的bug, 一样的报错, 一样的打印请求切面.

我之前是因为这里请求有req有ServletRequest, ServletRequest自己依赖自己, 打印的时候也是Gson递归OOM了,


后面的报错都是

	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127)
	```