opencsv不会导出父类的属性

时间:2017-11-29 09:22:57

标签: java inheritance entity parent opencsv

我使用com.opencsv 4.1,我想将实体类导出到csv文件。 问题是这个实体类扩展了另一个类。因此,当我导出它时,我只获得子类的字段。

以下是我写入csv文件的代码:

List<ActiveSubstance> activeSubstances = getActiveSubstances();
    File reportFile = new File( "activeSubstances.csv");
    Writer writer = new PrintWriter(reportFile);


    StatefulBeanToCsv<ActiveSubstance> beanToCsv = new StatefulBeanToCsvBuilder<ActiveSubstance>(writer)
        .withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
        .withSeparator(CSVWriter.DEFAULT_SEPARATOR)
        .build();
    beanToCsv.write(activeSubstances);
    writer.close();

我得到的导出文件包含以下行:

 ,,false,xx.model.ActiveSubstanceClass@29f9a8b9

我的父班:

@MappedSuperclass
public abstract class AbstractEntity {

  @Id
  @DiffIgnore
  @Column(name = "UUID")
  @CsvBindByName(column = "UUID")
  @CsvBindByPosition(position = 0)
  private String uuid;

  @Column(name = "CODE")
  @CsvBindByName(column = "CODE")
  @CsvBindByPosition(position = 1)
  private String code;

 public String getUuid() {
    return uuid;
  }

  public void setUuid(String uuid) {
    this.uuid = uuid;
  }

  public String getCode() {
    return code;
  }

  public void setCode(String code) {
    this.code = code;
  }
}

我的孩子班:

@Entity
@Table(name = "T_ACTIVE_SUBSTANCE")
public class ActiveSubstance extends AbstractEntity {

  @Column(name = "CRITICAL")
  @CsvBindByName(column = "CRITICAL")
  @CsvBindByPosition(position = 3)
  private Boolean critical;

  @ManyToOne
  @JoinColumn(name = "ACTIVE_SUBSTANCE_CLASS_ID")
  @CsvBindByName(column = "ACTIVE_SUBSTANCE_CLASS_ID")
  @CsvBindByPosition(position = 4)
  private ActiveSubstanceClass activeSubstanceClass;

/**
   * Default constructor
   */
  public ActiveSubstance() {
  }

  public Boolean getCritical() {
    return critical;
  }

  public void setCritical(Boolean critical) {
    this.critical = critical;
  }

  public ActiveSubstanceClass getActiveSubstanceClass() {
    return activeSubstanceClass;
  }

  public void setActiveSubstanceClass(ActiveSubstanceClass activeSubstanceClass) 
  {
    this.activeSubstanceClass = activeSubstanceClass;
  }
}

为什么父母的属性未导出?我怎么能得到它们? 此外,如何在我的csv文件而不是对象中获取activeSubstanceClass.toString?

如果有人可以提供帮助,我将非常感激。

提前谢谢。

2 个答案:

答案 0 :(得分:0)

您是否尝试过保护抽象类中的字段而不是私有字段,以便它们对子类可见?

答案 1 :(得分:0)

我正在使用OpenCSV 3.10。我尝试在具体的父类中使用受保护的字段,简而言之,不会导出继承的字段,详情如下。

父类:

import com.opencsv.bean.CsvBindByPosition;

public class ParentCsv {

    @CsvBindByPosition(position = 0)
    protected String firstField;

    public String getFirstField() {
        return firstField;
    }

    public void setFirstField(String firstField) {
        this.firstField = firstField;
    }
}

儿童班:

import com.opencsv.bean.CsvBindByPosition;

public class ChildCsv extends ParentCsv {

    @CsvBindByPosition(position = 1)
    private String secondField;

    @CsvBindByPosition(position = 2)
    private String thirdField;

    public String getSecondField() {
        return secondField;
    }

    public void setSecondField(String secondField) {
        this.secondField = secondField;
    }

    public String getThirdField() {
        return thirdField;
    }

    public void setThirdField(String thirdField) {
        this.thirdField = thirdField;
    }
}

当我跑步时:

ChildCsv childCsvToExport = new ChildCsv();
childCsvToExport.setFirstField("firstField");
childCsvToExport.setSecondField("secondField");
childCsvToExport.setThirdField("thirdField");

try {
    Writer writer = new FileWriter("yourfile.csv");
    StatefulBeanToCsv statefulBeanToCsvBuilder = new StatefulBeanToCsvBuilder(writer).withQuotechar(Character.MIN_VALUE).withSeparator('|').build();
    statefulBeanToCsvBuilder.write(childCsvToExport);
    writer.close();
} catch (IOException e) {
    e.printStackTrace();
} catch (CsvRequiredFieldEmptyException e) {
    e.printStackTrace();
} catch (CsvDataTypeMismatchException e) {
    e.printStackTrace();
}

我获得:

|secondField|thirdField