#java #cobol #mapstruct
#java #cobol #mapstruct
Вопрос:
Я работаю над созданием структуры сопоставления, которая преобразует объект JSon в плоский файл, определенный в тетради COBOL. Другими словами, выходной файл представляет собой файл фиксированной ширины. По сути, работа, необходимая для преобразования данных, представляет собой либо усечение, либо заполнение пробелами / нулями, в зависимости от предложения PIC поля вывода.
Моя идея заключалась в создании CobolString, которая представляла бы каждое рассматриваемое поле.
import lombok.*;
import org.apache.commons.lang3.StringUtils;
@RequiredArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class CobolString extends CobolType<String> {
@Getter
private final int length;
@Getter
@Setter
private String value;
public String getJavaValue() {
return getValue().trim();
}
public void setJavaValue(String javaValue) {
if (javaValue == null) {
setValue(StringUtils.repeat(' ', length));
return;
}
if (javaValue.length() > length) {
setValue(StringUtils.left(javaValue, length));
return;
}
setValue(javaValue StringUtils.repeat(' ', length - javaValue.length()));
}
@Override
public String getPic() {
return "PIC X(" length ")";
}
}
После этого я могу создать выходную запись следующим образом:
public class OutputRecord {
@Getter
private final CobolString field1 = new CobolString(4);
@Getter
private final CobolString field2 = new CobolString(2);
@Getter
private final CobolString field3 = new CobolString(10);
@Getter
private final CobolString field4 = new CobolString(5);
@Getter
private final CobolString field5 = new CobolString(3);
@Getter
private final CobolString field6 = new CobolString(5);
}
Из-за природы тетради COBOL, при создании этот объект CobolString представляет объявление самого поля в соответствии с предоставленной нам тетрадью.
Итак, при сопоставлении значений из InputObject я надеюсь сделать что-то подобное:
public OutputRecord mapInputToOutput(InputObject inputObject) {
OutputRecord.getField1().setJavaValue(inputObject.getField1());
OutputRecord.getField2().setJavaValue(inputObject.getField2());
OutputRecord.getField3().setJavaValue(inputObject.getField3());
OutputRecord.getField4().setJavaValue(inputObject.getField4());
OutputRecord.getField5().setJavaValue(inputObject.getField5());
OutputRecord.getField6().setJavaValue(inputObject.getField6());
}
Я надеялся использовать mapstruct для этого, но, похоже, требуется обновить поле one с правильным значением, когда я хочу, чтобы оно получило field1 и обновило его свойство javaValue.
Как я могу использовать Mapstruct со свойством, доступным только для чтения?
Комментарии:
1. Мое лучшее предположение после прочтения документов, это возможно только с использованием пользовательской стратегии именования средств доступа .