如何使用 opencsv 构建(工作的)自定义转换器
How do I build a (working) custom converter with opencsv
我正在使用带有嵌套 bean 结构的 OpenCSV。但是,我需要一个自定义转换器来实现这一点(目前专注于写入 csv 部分)。我环顾四周,但没有找到任何示例来帮助我弄清楚如何让它发挥作用。
我已经尝试扩展我的 child bean Class,并在主文档中提供了一些转换。但是我 运行 没有资源,我最远的就是让它抛出 CsvBadConverterException。
让我告诉你我有什么。 (User 和 UserScore 都实现了 Serializable,以防万一。)
Parent bean:用户
@CsvBindByName(column = "username")
private String userName;
@CsvBindByName(column = "password")
private String userPassword;
@CsvBindByName(column = "rememberPassword")
private boolean rememberPassword;
@CsvBindByName(column = "rememberUser")
private boolean rememberUser;
@CsvCustomBindByName(column = "scores", converter = UserScoreToBean.class)
private UserScore userScore;
// Constructors, getters, setters, and other methods
Child bean:UserScore
@CsvBindByName(column = "totalScore")
private int totalScore;
@CsvBindByName(column = "currentScore")
private int currentScore;
@CsvBindByName(column = "highestStreak")
private int highestStreak;
// Even more basic getter, setter, etc.
转换器:UserScoreToBean
public abstract class UserScoreToBean extends AbstractBeanField<User> {
@Override
protected Object convert(String s) {
UserScore score = new UserScore();
String[] split = s.split(".", 3);
score.setTotalScore(Integer.valueOf(split[0]));
score.setCurrentScore(Integer.valueOf(split[1]));
score.setHighestStreak(Integer.valueOf(split[2]));
return score;
// return null;
}
@Override
protected String convertToWrite(Object value) throws CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {
UserScore score = (UserScore) value;
return "\"" + score.getTotalScore() + "." + score.getCurrentScore() + "." + score.getHighestStreak() + "\"";
// return super.convertToWrite(value);
}
}
如您所见,我的转换器非常基础。所以我很乐意提供任何帮助。
为了便于故障排除,我刚刚让我的程序尝试在启动时生成一个 header,这给了我这个异常:
com.opencsv.exceptions.CsvBadConverterException: 实例化自定义转换器时出现问题 settings.user.UserScoreToBean。
感谢阅读!
使用 opencsv 5.0 及其新注释@CsvRecurse。嵌套对象中的项目将作为顶级出现在 csv 中。
如果您出于某种原因无法更改库,那么我会看一下 CsvBindAndSplitByName" 注释,但它需要进行一些调整。
我正在使用带有嵌套 bean 结构的 OpenCSV。但是,我需要一个自定义转换器来实现这一点(目前专注于写入 csv 部分)。我环顾四周,但没有找到任何示例来帮助我弄清楚如何让它发挥作用。
我已经尝试扩展我的 child bean Class,并在主文档中提供了一些转换。但是我 运行 没有资源,我最远的就是让它抛出 CsvBadConverterException。
让我告诉你我有什么。 (User 和 UserScore 都实现了 Serializable,以防万一。) Parent bean:用户
@CsvBindByName(column = "username")
private String userName;
@CsvBindByName(column = "password")
private String userPassword;
@CsvBindByName(column = "rememberPassword")
private boolean rememberPassword;
@CsvBindByName(column = "rememberUser")
private boolean rememberUser;
@CsvCustomBindByName(column = "scores", converter = UserScoreToBean.class)
private UserScore userScore;
// Constructors, getters, setters, and other methods
Child bean:UserScore
@CsvBindByName(column = "totalScore")
private int totalScore;
@CsvBindByName(column = "currentScore")
private int currentScore;
@CsvBindByName(column = "highestStreak")
private int highestStreak;
// Even more basic getter, setter, etc.
转换器:UserScoreToBean
public abstract class UserScoreToBean extends AbstractBeanField<User> {
@Override
protected Object convert(String s) {
UserScore score = new UserScore();
String[] split = s.split(".", 3);
score.setTotalScore(Integer.valueOf(split[0]));
score.setCurrentScore(Integer.valueOf(split[1]));
score.setHighestStreak(Integer.valueOf(split[2]));
return score;
// return null;
}
@Override
protected String convertToWrite(Object value) throws CsvDataTypeMismatchException, CsvRequiredFieldEmptyException {
UserScore score = (UserScore) value;
return "\"" + score.getTotalScore() + "." + score.getCurrentScore() + "." + score.getHighestStreak() + "\"";
// return super.convertToWrite(value);
}
}
如您所见,我的转换器非常基础。所以我很乐意提供任何帮助。 为了便于故障排除,我刚刚让我的程序尝试在启动时生成一个 header,这给了我这个异常:
com.opencsv.exceptions.CsvBadConverterException: 实例化自定义转换器时出现问题 settings.user.UserScoreToBean。
感谢阅读!
使用 opencsv 5.0 及其新注释@CsvRecurse。嵌套对象中的项目将作为顶级出现在 csv 中。
如果您出于某种原因无法更改库,那么我会看一下 CsvBindAndSplitByName" 注释,但它需要进行一些调整。