Преобразование объекта j8583 с одним геттером с параметрами в Dozer

У меня есть объект IsoMessage ( https://github.com/chochos/j8583/blob/master/src/main/java/com/solab/iso8583/IsoMessage.java), который имеет внутренний массив, к которому я могу получить доступ только через метод getField(int).

public class IsoMessage {

    @SuppressWarnings("rawtypes")
    private IsoValue[] fields = new IsoValue[129];
    .........
    .........
    .........

    /** Returns the IsoValue for the specified field. First real field is 2. */
    @SuppressWarnings("unchecked")
    public <T> IsoValue<T> getField(int field) {
        return fields[field];
    }

Мне нужно прочитать все атрибуты, хранящиеся в массиве fields, вызвав getField(номер параметра), и переместить их в новый объект с картой, и я хочу добиться этого с помощью dozer.

объект, который мне нужно перевести на:

public class TransactionInstance implements Serializable {

    private static final long serialVersionUID = 3429335891821913088L;
    private String transactionName;
    private Map<String, String> parameters;

Я экспериментировал с этой конфигурацией бульдозера, надеясь получить поле 1 из моего объекта isoMessage

<mapping map-id="a">
    <class-a>com.solab.iso8583.IsoMessage</class-a>
    <class-b>j8583.example.TransactionInstance</class-b>
    <field>
        <a get-method="getField" key="1">field</a>
        <b map-set-method="put">parameters</b>
    </field>
</mapping>

Но я застрял в получении значения от исходного объекта с этим исключением:

Exception in thread "main" org.dozer.MappingException: No read or write method found for field (field) in class (class com.solab.iso8583.IsoMessage)
    at org.dozer.propertydescriptor.GetterSetterPropertyDescriptor.determinePropertyType(GetterSetterPropertyDescriptor.java:319)
    at org.dozer.propertydescriptor.GetterSetterPropertyDescriptor.getPropertyType(GetterSetterPropertyDescriptor.java:76)
    at org.dozer.fieldmap.MapFieldMap.determineActualPropertyType(MapFieldMap.java:170)
    at org.dozer.fieldmap.MapFieldMap.getSrcFieldValue(MapFieldMap.java:95)

Я проверял этот пост https://github.com/DozerMapper/dozer/issues/111 и как передать `this` в отображение поля Dozer? шина все еще застряла в том же месте, и мне было интересно, смогу ли я достичь этого с помощью API, чтобы я мог динамически определить, какие поля я хочу получить из исходного компонента

2 ответа

Решение

Я наконец-то нашел подходящее отображение, используя возможность, которую dozer имеет для прямого доступа к внутренним объектам ( http://dozer.sourceforge.net/documentation/custommethods.html).

<mapping>
    <class-a is-accessible="true">com.solab.iso8583.IsoMessage</class-a>
    <class-b>j8583.example.TransactionInstance</class-b>
    <field>
        <a>fields[3]</a>
        <b set-method="addParameter" map-set-method="addParameter" key="field3">parameters
        </b>
    </field>

</mapping>

Я не знаком с Dozer, но поле 1 является растровым изображением. getField(1) возвращается null,

Другие вопросы по тегам