diff --git a/src/main/java/com/yexuejc/base/converter/IntegerNullValueDeserializer.java b/src/main/java/com/yexuejc/base/converter/IntegerNullValueDeserializer.java new file mode 100644 index 0000000..89e0e05 --- /dev/null +++ b/src/main/java/com/yexuejc/base/converter/IntegerNullValueDeserializer.java @@ -0,0 +1,38 @@ +package com.yexuejc.base.converter; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer; + +/** + * 反序列化中内容为空时,返回Integer为空 + *

使用方式:@JsonDeserialize(using = IntegerNullValueDeserializer.class)

+ * @author: yexuejc + * @date: 2024/4/15 18:08 + */ +public class IntegerNullValueDeserializer extends StdScalarDeserializer { + public IntegerNullValueDeserializer() { + super(Integer.class); + } + + @Override + public Integer deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + String value = p.getValueAsString(); + if (isInteger(value)) { + return super._parseInteger(p, ctxt, Integer.class); + } else { + return null; + } + } + + private static boolean isInteger(String s) { + try { + Integer.parseInt(s); + return true; + } catch (NumberFormatException e) { + return false; + } + } +} \ No newline at end of file diff --git a/src/test/java/com/yexuejc/base/util/FileUtilTest.java b/src/test/java/com/yexuejc/base/util/FileUtilTest.java index e376e46..da8e212 100644 --- a/src/test/java/com/yexuejc/base/util/FileUtilTest.java +++ b/src/test/java/com/yexuejc/base/util/FileUtilTest.java @@ -4,6 +4,7 @@ import java.io.File; import java.io.IOException; import java.nio.file.Paths; import java.util.List; +import java.util.stream.Collectors; import com.yexuejc.base.pojo.ReadFileBean; import com.yexuejc.base.util.bean.AppnodeCertCsvBean; @@ -54,19 +55,63 @@ public class FileUtilTest { } private static void readCsvFile() throws IOException { - String path = "F:\\coding\\yexuejc-base2\\src\\test\\java\\com\\yexuejc\\base\\util\\test.csv"; + String path = "F:\\coding\\yexuejc-base\\src\\test\\java\\com\\yexuejc\\base\\util\\test.csv"; - List list = FileUtil.readCsv(path, AppnodeCertCsvBean.class, true, "enable,domain,protocol,deployHost,deployPath,uname,pwd,appnodeId", ','); - System.out.println("***********************************************"); - System.out.println(JsonUtil.formatPrinter(list)); - System.out.println("条数:" + list.size()); +// List list = FileUtil.readCsv(path, AppnodeCertCsvBean.class, true, "enable,domain,protocol,deployHost,deployPath,uname,pwd,appnodeId", ','); +// System.out.println("***********************************************"); +// System.out.println(JsonUtil.formatPrinter(list)); +// System.out.println("条数:" + list.size()); + //直接把每行读取成字符串 + ReadFileBean readFileBean2 = new ReadFileBean<>(2); + ReadFileBean bean2 = FileUtil.readBigFile(path, readFileBean2); + System.out.println("直接把每行读取成字符串============================================"); + System.out.println(JsonUtil.formatPrinter(bean2)); + System.out.println("直接把每行读取成字符串============================================"); + + //自定义每行数据的处理 + ReadFileBean readFileBean1 = new ReadFileBean<>(2); + ReadFileBean bean1 = FileUtil.readBigFile(path, readFileBean1, datas -> { + if (readFileBean1.getStartRowNum() == 1) { + datas.remove(0);//跳过第一行 + } + return datas.stream().map(str -> { + //自定义处理每一条数据 + String[] split = str.split(","); + AppnodeCertCsvBean app = new AppnodeCertCsvBean(); + app.setEnable(getValue(split, 0)); + app.setDomain(getValue(split, 1)); + app.setProtocol(getValue(split, 2)); + app.setDeployHost(getValue(split, 3)); + app.setDeployPath(getValue(split, 4)); + app.setUname(getValue(split, 5)); + app.setPwd(getValue(split, 6)); + if (StrUtil.isNotEmpty(getValue(split, 7))) { + app.setAppnodeId(Integer.valueOf(getValue(split, 7))); + } + return app; + }).collect(Collectors.toList()); + }); + System.out.println("自定义每行数据的处理============================================"); + System.out.println(JsonUtil.formatPrinter(bean1)); + System.out.println("自定义每行数据的处理============================================"); + + //直接使用提供的csv文件读取 ReadFileBean readFileBean = new ReadFileBean<>(2); do { ReadFileBean bean = FileUtil.readBigFile(path, readFileBean, AppnodeCertCsvBean.class); - System.out.println("============================================"); + System.out.println("直接使用提供的csv文件读取============================================"); System.out.println(JsonUtil.formatPrinter(bean)); + System.out.println("直接使用提供的csv文件读取============================================"); } while (readFileBean.hasNext()); } + + private static String getValue(String[] value, int index) { + try { + return value[index]; + } catch (Exception e) { + return ""; + } + } } diff --git a/src/test/java/com/yexuejc/base/util/bean/AppnodeCertCsvBean.java b/src/test/java/com/yexuejc/base/util/bean/AppnodeCertCsvBean.java index 742509a..3c5e51c 100644 --- a/src/test/java/com/yexuejc/base/util/bean/AppnodeCertCsvBean.java +++ b/src/test/java/com/yexuejc/base/util/bean/AppnodeCertCsvBean.java @@ -2,14 +2,16 @@ package com.yexuejc.base.util.bean; import java.io.Serializable; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.yexuejc.base.annotation.CsvToBean; +import com.yexuejc.base.converter.IntegerNullValueDeserializer; /** * * @author: yexuejc * @date: 2024/2/27 10:40 */ -@CsvToBean(header = "enable,domain,protocol,deployHost,deployPath,uname,pwd,appnodeId", hasHeader = true) +@CsvToBean(header = "enable,domain,protocol,deployHost,deployPath,uname,pwd,appnodeId") public class AppnodeCertCsvBean implements Serializable { /**是否生效:Y/N*/ private String enable; @@ -37,6 +39,7 @@ public class AppnodeCertCsvBean implements Serializable { /** * appnode协议时:且远程部署时,对应的远程appnode的ApiNodeId */ + @JsonDeserialize(using = IntegerNullValueDeserializer.class) private Integer appnodeId; public String getEnable() { diff --git a/src/test/java/com/yexuejc/base/util/test.csv b/src/test/java/com/yexuejc/base/util/test.csv new file mode 100644 index 0000000..e211e74 --- /dev/null +++ b/src/test/java/com/yexuejc/base/util/test.csv @@ -0,0 +1,10 @@ +是否生效,域名,部署协议,部署服务器,部署证书位置,服务器账号,服务器密码,appnodeId +N,kasm.mx.yexuejc.top,appnode,http://192.168.56.101:8888,,admin,admin,1 +N,kasm.mx.yexuejc.top,appnode,local,,,, +N,shop.mx.yexuejc.top,appnode,local,,,, +Y,cloud.yexuejc.top,ssh,118.126.109.109:10371,/home/frpuser/http/cert/,frpuser,yexuejc1, +Y,blog.yexuejc.top,ssh,118.126.109.109:10371,/home/frpuser/http/cert/,frpuser,yexuejc1, +Y,yexuejc.top,ssh,118.126.109.109:10371,/home/frpuser/http/cert/,frpuser,yexuejc1, +Y,jenkins.yexuejc.top,ssh,118.126.109.109:10371,/home/frpuser/http/cert/,frpuser,yexuejc1, +Y,git.yexuejc.top,ssh,118.126.109.109:10371,/home/frpuser/http/cert/,frpuser,yexuejc1, +Y,nexus.yexuejc.top,ssh,118.126.109.109:10371,/home/frpuser/http/cert/,frpuser,yexuejc1,