一、问题描述
使用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之后的版本有没有解决这个问题;
标签:map,value,问题,key,ScrewUtil,jsonField,NullPointer From: https://www.cnblogs.com/seeall/p/16715612.html