Посоветуйте, как реализовать динамические c классы в java - PullRequest
0 голосов
/ 14 июля 2020

Попытка реализовать 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;
  }
...