Проверяйте проанализированные поля с помощью Univocity Parser
Я хотел знать, есть ли способ проверить и проверить поле при использовании пакета CsvRoutines. По сути, я хочу обработать строку, если в первом столбце есть только числа, и пропустить /, возможно, вызвать исключение в противном случае. Я предполагаю, что аннотация @Validate, выпущенная в 2.7.0, может быть использована для достижения этой цели. Но я хотел бы знать, есть ли другой способ добиться того же с более ранними версиями, такими как 2.5.9?
1 ответ
Автор библиотеки здесь. Там нет другого способа, кроме обновления до последней версии. Есть ли какая-то конкретная причина, почему вы не можете обновить?
Обновление: вы можете поставить @Parsed
аннотации к получателям или установщикам класса и выполнению проверок в них. Это, наверное, самый чистый способ сделать это. Например:
class Test {
private Integer number;
//accepts a String here... so this is straight from the parser before it tries to convert anything into an integer - which lets you validate or throw a custom exception
@Parsed
void setNumber(String number){
try{
this.number = Integer.valueOf(number);
} catch(NumberFormatException e){
throw new IllegalArgumentException(number + " is not a valid integer");
}
}
}
Другой альтернативой является использование пользовательского класса преобразования. Скопируйте код класса ValidatedConversion, использованный в последней версии, затем создайте подкласс, например:
public static class RangeLimiter extends ValidatedConversion {
int min;
int max;
public RangeLimiter(String[] args) {
super(false, false); //not null, not blank
min = Integer.parseInt(args[0]);
max = Integer.parseInt(args[1]);
}
protected void validate(Object value) {
super.validate(value); //runs the existing validations for not null and not blank
int v = ((Number) value).intValue();
if (v < min || v > max) {
throw new DataValidationException("out of range: " + min + " >= " + value + " <=" + max);
}
}
}
Теперь в вашем коде используйте это:
@Parsed(field = "number")
@Convert(conversionClass = RangeLimiter.class, args = {"1", "10"}) //min = 1, max = 10
public int number;
Я не проверял это против старой версии. Я думаю, вам может понадобиться установить флаг applyDefaultConversion=false
в @Parsed
аннотации, и сделайте ваш класс преобразования преобразовать String
в int
в дополнение к запуску проверок.
В целом, это довольно трудоемкая работа, которую можно легко избежать, просто обновив ее до последней версии.