ScrewUtil - NullPointer问题

一、问题描述

使用ScrewUtil导出PostgreSQL的表结构时,报错NullPointer;

 

二、问题排查

首先,ScrewUtil确实很好用,之前导出mysql的表一点问题没有;而且只需要一些简单的配置,run一个main函数就可以导出doc、html等格式的数据库文档;

1,使用idea可以下载ScrewUtil的源码

 2,debug定位出问题代码

2.1

2.2

2.3

2.4

2.5

2.6

2.7

 3,发现问题

发现上面2.7中,map.get(jsonField.value()),map的key值有时候是大写,有的时候是小写;

而@MappingField注解的value有的地方是大写,有的地方是小写;

 

 

所以,有时候从map中根据key值获取到的是null值,导致上面2.3中i.getTableName()产生NullPointer异常;

 

 三、问题解决

1,new一个同名package、同类名的Mapping.java文件

 最后将这个复制的源码文件copy到新创建的同名package下

2,重写有问题的方法

 以下红色字体为修改的地方

    private static <T> T getObject(Class<T> clazz, List<FieldMethod> fieldMethods,
                                   Map<String, Object> map) throws InstantiationException,
                                                            IllegalAccessException,
                                                            InvocationTargetException {
        // map的key全转成大写
        Map<String, Object> ignoreCaseMap = new HashMap<>(map.size());
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            String key = entry.getKey();
            if (StringUtils.isNotBlank(key)) {
                ignoreCaseMap.put(key.toUpperCase(), entry.getValue());
            }
        }

        T rsp = clazz.newInstance();
        //设置属性值
        for (FieldMethod filed : fieldMethods) {
            Field field = filed.getField();
            Method method = filed.getMethod();
            MappingField jsonField = field.getAnnotation(MappingField.class);
            if (!Objects.isNull(jsonField)) {
                // @MappingField注解的value也全转成大写
                method.invoke(rsp, ignoreCaseMap.get(jsonField.value().toUpperCase()));
            }
        }
        return rsp;
    }

3,导出数据库文档成功

 

四、总结

不知道ScrewUtil之后的版本有没有解决这个问题;

 

posted @ 2022-09-21 14:58  seeAll  阅读(105)  评论(0编辑  收藏  举报