问题描述
在导入学生信息的时候发现导入成功之后结果显示是错误的,错误如下所示
刚开始的时候只是感觉是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。
实现方法改进
新增一个字段用于前台的显示,并设置原字段为只可写的字段,新生成字段只是读取原身份证字段,但不保存到数据库中,实现方式如下。
/**
* 身份证 长度为十八位 返回前台
* 仅支持json写入,json输出时,将忽略掉
*/
@Size(min = 18, max = 18)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String idCardNumber;
/**
* 该字段并不存在数据表中,只用于前台使用
*/
@Transient
private String idCardNumberForShow;
public String getIdCardNumberForShow() {
if (idCardNumber != null) {
StringBuffer encryptIdCardNumber = new StringBuffer(idCardNumber);
encryptIdCardNumber.replace(6, idCardNumber.length() - 6, "******");
return encryptIdCardNumber.toString();
} else {
return "";
}
}
@Deprecated
private void setIdCardNumberForShow(String idCardNumberForShow) {}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。