Попытка реализовать logi c, где файлы, отправленные пользователями, могут обрабатываться (сохранять данные в db). Файл загружается на сервер через вызов API POST. Формат файла определяется для каждого пользователя, когда пользователи регистрируются в системе заранее, указывая формат в JSON. Если пользователь регистрирует формат, а затем загружает файл, формат файла должен быть распознан и данные файла должны быть обработаны. Я попытался преобразовать json в классы домена Dynami c, предложенный https://github.com/CSCONNECT/json2java Требуется класс, поскольку ORM используется для сохранения в db.
Альтернативный подход - для управления DDL DML на уровне кода вместо использования ORM и использования JDB C соединение для сохранения, которое работает нормально, поскольку первый подход не масштабируется.
Есть ли какие-либо подходы, которые я не рассматриваю? Можно ли эффективно определять классы домена без перезапуска сервера?
Это домашний проект для обучения.
код: Ниже представлена структура, которую формат файла в JSON преобразует в объект. с использованием Gson для достижения того же.
@Data
public class ColumnMeta implements Serializable {
private int order;
private String columnName;
private String dataType;
private Integer maxLength;
}
@Data
public class FormatModel {
private List<ColumnMeta> columns;
}
поэтому теперь формат присутствует в БД и доступен для приложения для запроса и создания объекта.
@Override
public void run() {
List<String> records = readContent();
if(records == null || !validate(records)) {
reportError(getLocation(),getFileName());
} else {
loadToDB(records);
}
}
@Override
public boolean validate(List<String> records) {
String vendorId = getFileName().split("_")[0];
boolean vendorIdExists = vendorService.existsVendorById(vendorId);
if(!vendorIdExists) return false;
Vendor vendor = vendorService.getVendorById(vendorId);
log.info("vendor name {} ", vendor.getVendorName());
boolean formatValid;
errorRecords = new LinkedList<>();
try {
switch (vendor.getFileType()) {
case "CSV":
formatValid = validateCsv(vendor.getFormat(),vendor.getVendorId(), records);
break;
case "JSON":
formatValid = validateJson(vendor.getFormat(), vendor.getVendorId(), records);
break;
case "TSV":
formatValid = validateTSV(vendor.getFormat(), vendor.getVendorId(), records);
break;
default:
formatValid = super.validate(records);
}
} catch (JsonSyntaxException e) {
log.error("error parsing db stored format for vendor {} file name {}"
,vendor.getVendorName(), getFileName());
return false;
}
return formatValid && vendorIdExists;
}
пример реализации методы проверки -
public boolean validateJson(String format, String vendorId, List<String> records) throws JsonSyntaxException {
FormatModel formatModel = super.getGson().fromJson(format, FormatModel.class);
String jsonString = records.stream().collect(Collectors.joining(" "));
// collect data into single JSON string
String tableName = vendorTableService.lookupTableName(Integer.parseInt(vendorId));
if(tableName.isBlank()) {
log.error("unregistered vendor file {}", vendorId);
super.createVendorEntry(vendorId, format);
return false;
}
// prepare insert query using tableName, records
// persist data
// if in error
return false;
}