如何使用自定义拆分器拆分用分隔符分隔的csv列?

时间:2019-05-18 09:42:14

标签: java spring-mvc opencsv

我有一个rest控制器,它具有一个后置映射,应该接受csv / text作为输入。以下是csv的格式:-

id, name, phoneNumber
n1,Joe/Dowwel,123-212-3233
n2,Sara/Ali,132,232,3111

我正在使用开放式csv注释,如下所示,将csv转换为java pojo作为后映射控制器方法的输入。:-

@CsvBindByPosition(position=2)
private String name;

此批注会将CSV输入字段“名称”映射到Java对象(PO​​JO)字段“名称”(如下所示)

public class Employee {


    @CsvBindByPosition(position=1)
    private String id;

    @CsvBindByPosition(position=2)
    private String name;

    @CsvBindByPosition(position=3)
    private String phoneNumber;

    public Employee () {
    }  

但是,在spring转换器将其转换后的java pojo中,'name'的值将为ex:Joe / Dowwel(带分号'/')

我的要求是在员工POJO中具有2个单独的字段“ firstName”和“ lastName”,这样我就可以像“ firstName” = Joe和“ lastname” = Dowwel一样对其进行拆分和分隔。

有什么方法可以使用更清洁的方法来实现?也许使用更多注释进行过滤?

任何帮助将不胜感激。预先感谢。

1 个答案:

答案 0 :(得分:0)

很显然,您的输入数据未映射到您的类结构。 Square peg, round hole.这里没有神奇的解决方案。

您必须:

  • 修复数据源,要求数据发布者将name的单个字段分成一对字段given_namesurname
  • 解析数据,将单个值分成一对值。

第一个选项是理想的。首先要使数据正确通信,而不是在事后修改数据。

如果这不可能,那么您必须找到一种解决方法。

我想到的第一个解决方法是,您在Employee类上有一个构造函数,该构造函数采用传入的组合名称并将其拆分为其他两个字段。参见String::split

但是,在当前代码中使用该解决方法意味着除了名字和姓氏成员字段之外,在name上定义一个冗余的Employee成员字段。因此,另一个解决方法是不使用CSV库的绑定功能。而是编写一些代码来读取CSV的每个字段,并将其传递给Employee的构造函数。遇到name字段时,将其拆分,然后将这两部分都传递给构造函数。