390 Star 1.6K Fork 482

闲.大赋(李家智) / BeetlSQL

 / 详情

目前beetlsql严重影响正常使用的2个bug

已完成
创建于  
2023-04-29 10:05

@Gavin-King
@程序猿猴
@zhoupan
@woate
@一日看尽长安花
@闲.大赋(李家智)

目前beetlsql严重影响正常使用的2个bug

bug1,特定情况下使用@ResultProvider(AutoJsonMapper.class)会死循环,例如:

    @Data
    @EqualsAndHashCode(callSuper = true)
    @ResultProvider(AutoJsonMapper.class)
    public class SysDeptExample extends BaseEntityExample {
    
        private static final long serialVersionUID = 1L;
    
        private List<SysDeptExample> children = new ArrayList<>();
    
    }

就会出现以下死循环错误:

    Caused by: java.lang.StackOverflowError: null
        at java.lang.String.substring(String.java:1969)
        at sun.reflect.misc.ReflectUtil.isNonPublicProxyClass(ReflectUtil.java:288)
        at sun.reflect.misc.ReflectUtil.checkPackageAccess(ReflectUtil.java:165)
        at sun.reflect.misc.ReflectUtil.isPackageAccessible(ReflectUtil.java:195)
        at java.beans.MethodRef.get(MethodRef.java:72)
        at java.beans.PropertyDescriptor.getReadMethod(PropertyDescriptor.java:207)
        at org.beetl.sql.core.mapping.join.AutoJsonMapper.getMappingByJson(AutoJsonMapper.java:61)
        at org.beetl.sql.core.mapping.join.AutoJsonMapper.getMappingByJson(AutoJsonMapper.java:70)
        at org.beetl.sql.core.mapping.join.AutoJsonMapper.getMappingByJson(AutoJsonMapper.java:70)
        at org.beetl.sql.core.mapping.join.AutoJsonMapper.getMappingByJson(AutoJsonMapper.java:70)
        at org.beetl.sql.core.mapping.join.AutoJsonMapper.getMappingByJson(AutoJsonMapper.java:70)

bug2,当同一个方法中,特定情况下执行2个完全一样的sql会出错,例如:

示例中的selectExampleList如果放selectExampleList2前面执行会报错,如果放selectExampleList2后面执行则不会报错

    selectExampleList
    ===
    * 查询示例列表
    ```
    select u.user_id, u.user_name, d.dept_id as "dept.dept_id"
    from sys_user u
    left join sys_dept d on u.dept_id = d.dept_id
    ```
    
    selectExampleList2
    ===
    * 查询示例列表
    ```
    select u.user_id, d.dept_id as "dept.dept_id"
    from sys_user u
    left join sys_dept d on u.dept_id = d.dept_id
    ```
    
    @GetMapping("/list")
    public ResultTable<SysUserExample> list() {
        PageRequest<SysUserExample> pageRequest = DefaultPageRequest.of(1, 10);

        SqlId sqlId1 = SqlId.of("example.user.selectExampleList");
        List<SysUserExample> result1 = sqlManager.select(sqlId1, SysUserExample.class);
        System.out.println("查询示例列表:" + JSON.toJSONString(result1));

        SqlId sqlId2 = SqlId.of("example.user.selectExampleList2");
        List<SysUserExample> result2 = sqlManager.select(sqlId2, SysUserExample.class);
        System.out.println("查询示例列表:" + JSON.toJSONString(result2));
    }

就会出现以下错误:

    09:53:14.477 [http-nio-9999-exec-2] ERROR c.y.s.c.e.GlobalExceptionHandler - [handleRuntimeException,86] - 请求地址'/example/user/list',发生未知异常.
    org.beetl.sql.clazz.kit.BeetlSQLException: java.sql.SQLException: Column Index out of range, 3 > 2. 
        at org.beetl.sql.core.mapping.join.ConfigJoinMapper.mapping(ConfigJoinMapper.java:87)
        at org.beetl.sql.core.BaseSQLExecutor.select(BaseSQLExecutor.java:168)
        at org.beetl.sql.core.BaseSQLExecutor.select(BaseSQLExecutor.java:119)
        at org.beetl.sql.core.SQLManager.select(SQLManager.java:407)
        at org.beetl.sql.core.SQLManager.select(SQLManager.java:418)
        at com.yiyoya.example.controller.ExampleController.list(ExampleController.java:44)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:111)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:111)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:111)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)

btsql-ext.properties的配置

    # beetlsql默认是开发模式,因此修改md的sql文件,不需要重启。但建议线上不要使用开发模式,因为此模式会每次sql调用都会检测md文件是否变化
    PRODUCT_MODE = false
    # 默认sql模板文件采用的是系统默认字符集,可以更改配置采用指定的字符集
    CHARSET = UTF-8
    
    # 自定义配置
    # 占位符号输出?
    DELIMITER_PLACEHOLDER_START=${
    DELIMITER_PLACEHOLDER_END=}
    # 占位符号输出text
    DELIMITER_PLACEHOLDER_START2=$(
    DELIMITER_PLACEHOLDER_END2=)
    # 定界符号
    DELIMITER_STATEMENT_START=-- @
    DELIMITER_STATEMENT_END=

评论 (6)

淡漠的流年 创建了任务

bug2中的原因为AutoJsonMapper中使用了缓存,缓存了第一个sql,而执行第二个sql时,使用了第一个sql的缓存配置,导致的错误,目前我是自己写了个ExtendAutoJsonMapper,暂时删除了缓存功能,就能正常使用了

@淡漠的流年 多谢,应该是AutoKey对象 不应该以Class为主键,因该联合Class和SqlId为key,我改改,周末发布一下

@淡漠的流年 这俩个bug我都修复了,晚上会发一个版本。 修改代码参考AutoJsonMapper提交历史

测试参考 JsonMappingTest.recursion

@淡漠的流年 已经发版了,用最新版本

闲.大赋(李家智) 任务状态待办的 修改为已完成

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
29 xiandafu 1678706040
Java
1
https://gitee.com/xiandafu/beetlsql.git
git@gitee.com:xiandafu/beetlsql.git
xiandafu
beetlsql
BeetlSQL

搜索帮助