Dozer mapping для сложных объектов - PullRequest
0 голосов
/ 11 октября 2019

У меня есть 2 POJO, как показано ниже:

package com.main.java.src;

    public class SourceObj {

    protected String name;
    ...
    ...
    10 String objects

    protected Addresses addresses; 

    ...
    ...
    getter and setter for all fields

    }
---------    
package com.java.main.src;

    public class Addresses {
     protected List<Address> address;
    ...
    getters and setters

}

    package com.main.java.src;

    public class Address {
       protected String city;

       protected List<Contact> contact;

    ...

    getters & setters
    }

-----
package com.main.java.dest;
    public class DestObj {

    protected String name;
    ...
    ...
    10 String objects

    protected Addresses addresses; 

    ...
    ...
    getter and setter for all fields

    }

----------------
package com.main.java.dest;

    public class Addresses {
     protected List<Address> address;
    ...
    getters and setters
    }

package com.main.java.dest;
    public class Address {
       protected String city;

       protected List<Contact> contact;

    ...

    getters & setters
    }

Now i have the dozer-configuration.xml as follows:

    <?xml version="1.0" encoding="UTF-8"?>
    <mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd">
        <configuration>
            <stop-on-errors>true</stop-on-errors>
            <trim-strings>true</trim-strings>
            <relationship-type>non-cumulative</relationship-type>       
        </configuration>

        <mapping>
            <class-a>com.main.java.src.SourceObj</class-a>
            <class-b>com.main.java.dest.DestObj</class-b>
            <field>
                <a>addresses.address</a>
                <b>addresses.address</b>
                <a-hint>com.main.java.src.Address</a-hint>
                <b-hint>com.main.java.dest.Address</b-hint>
            <field> 
        </mapping>
    </mappings>

Теперь приведенное выше отображение копирует поля, такие как имя из SourceObj, в DestObj, но не может отобразить СписокАдрес из пакета src в Список адресов пакета dest. Снова внутри объекта Address есть список объекта Contact.

Одно решение, которое я нашел, - написать собственный конвертер, который будет копировать значения примитивных полей одно за другим, а затем все объекты из одного списка в другой список назначения.

Но я ищу решение в dozer-configuration.xml.

После приведенных выше сопоставлений xml получаю исключение:

MapId: null
  Type: null
  Source parent class: com.main.java.src.SourceObj
  Source field name: addresses.address
  Source field type: class java.util.ArrayList
  Source field value: [com.main.java.src.Address@1b65d51d]
  Dest parent class: com.main.java.dest.DestObj
  Dest field name: addresses.address
  Dest field type: java.util.List

java.lang.NullPointerException: null
    at org.dozer.util.ReflectionUtils.invoke(ReflectionUtils.java:329) ~[dozer-5.5.1.jar:?]
    at org.dozer.propertydescriptor.GetterSetterPropertyDescriptor.writeDeepDestinationValue(GetterSetterPropertyDescriptor.java:268) ~[dozer-5.5.1.jar:?]
    at org.dozer.propertydescriptor.GetterSetterPropertyDescriptor.setPropertyValue(GetterSetterPropertyDescriptor.java:96) ~[dozer-5.5.1.jar:?]
    at org.dozer.fieldmap.FieldMap.writeDestValue(FieldMap.java:96) ~[dozer-5.5.1.jar:?]
    at org.dozer.MappingProcessor.writeDestinationValue(MappingProcessor.java:939) ~[dozer-5.5.1.jar:?]
    at org.dozer.MappingProcessor.mapFromFieldMap(MappingProcessor.java:368) ~[dozer-5.5.1.jar:?]
    at org.dozer.MappingProcessor.mapField(MappingProcessor.java:307) [dozer-5.5.1.jar:?]
    at org.dozer.MappingProcessor.map(MappingProcessor.java:267) [dozer-5.5.1.jar:?]
    at org.dozer.MappingProcessor.mapToDestObject(MappingProcessor.java:216) [dozer-5.5.1.jar:?]
    at org.dozer.MappingProcessor.createByCreationDirectiveAndMap(MappingProcessor.java:196) [dozer-5.5.1.jar:?]
    at org.dozer.MappingProcessor.mapGeneral(MappingProcessor.java:170) [dozer-5.5.1.jar:?]
    at org.dozer.MappingProcessor.map(MappingProcessor.java:104) [dozer-5.5.1.jar:?]
    at org.dozer.MappingProcessor.map(MappingProcessor.java:99) [dozer-5.5.1.jar:?]
    at org.dozer.DozerBeanMapper.map(DozerBeanMapper.java:120) [dozer-5.5.1.jar:?]

Пожалуйста, сообщитерешение для этого случая.

1 Ответ

0 голосов
/ 11 октября 2019

Dozer автоматически сопоставит все с тем же именем и типом. Когда поля, которые вы хотите отобразить, имеют разные имена, вы должны явно указать Dozer в отображении, какие поля сопоставлять друг с другом. В приведенном выше вопросе AddressSrc и AddressDest - это поля с разными именами. Следовательно, вы должны явно указать Dozer для сопоставления этих двух полей друг с другом.

<mapping>
    <class-a>SourceObj</class-a>
    <class-b>DestObj</class-b>    
    <field>
        <a>addressesSrc</a>
        <b set-method="customSetMethodName">addressesDest</b>
    </field>  
</mapping>

Вам могут понадобиться дополнительные инструкции по отображению, чтобы получить желаемый результат. Тем не менее, это недостающий элемент отображения, который вам нужен, чтобы Dozer отобразил эти два поля, поскольку они имеют разные имена.

...