Как обновить значение свойства, доступного только для чтения, с помощью Mapstruct?

#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. Мое лучшее предположение после прочтения документов, это возможно только с использованием пользовательской стратегии именования средств доступа .