共计 1173 个字符,预计需要花费 3 分钟才能阅读完成。
问题描述
在导入学生信息的时候发现导入成功之后结果显示是错误的,错误如下所示
刚开始的时候只是感觉是 ID card 出得问题,但是并没有明白具体的什么地方出得问题,下面是我们导入的示例信息,然后我们点开数据库看了一下我们数据库里的值,发现并不是我们导入的值,而是 2147483647 然后 Google 了一下这个数字,发现如下
然后感觉是不是数据类型导致的问题,于是看了一下源码发现如下,当前我们的单元格默认为数字,然后按照数字进行处理,结果因为身份证的数字太大,导致导致 int 无法保存。
之后因为身份证中也可能含有字母所以解决方法改为将单元格的类型设置为文本类型。
更改单元格格式为文本
再设置单元格类型的时候由于我们使用的是导出模版原来是按照 Java 通过代码生成的,改的时候感觉很麻烦,而且之后考虑到还要为模版添加示例数据,更改样式之类的操作,如果一直使用 Java 的代码生成的化,会很费事,于是将导出模版的功能更改为直接导出一个模版的静态文件,之后当我们的模版需要更改的时候我们只需要手动更改 excel 就行,感觉这样会方便很多。
为什么非 18 位的身份证可以保存
因为我记得字段是加了长度限制的,之后在源码中看了一下,发现之前的写法如下:
@Column(length = 18)
private String idCardNumber;
更该之后的代码, 可以使用 @Size 或 @Length:
@Size(min = 18, max = 18)
private String idCardNumber;
@Length(min = 18, max = 18)
private String idCardNumber;
@Size,@Longth 和 @Column(length = value)之间的差异
处理 warn 错误
最开始一直不清楚为什么会出错,一直找不到错误原因是什么,之后问了一下喜硕,他帮我找了一下发现错误原因是如下, 更改了 idcard 的 get 方法:
public String getIdCardNumber() {
// 获取身份证时将身份证加密
StringBuffer encryptIdCardNumber = new StringBuffer(idCardNumber);
encryptIdCardNumber.replace(6, idCardNumber.length() – 6, “******”);
return encryptIdCardNumber.toString();
}
第一处是因为当身份证长度小于 12 位是替换中间位数位 * 的方法会报错,因为替换的 start 大于了 end
第二处是猜测是因为在 yunzhiRepository 中会默认的调用 student 的属性,有些时候属性是不全的会导致空指针异常。
解决 warn 报错
@Size 固定保存的长度时,就不会产生第一个异常了。
加上 idcard 为空的判断,如果为空之前返回 idcard。