Глубокое картирование Dozer не работает - PullRequest
1 голос
/ 10 июня 2010

Я пытаюсь использовать dozer 4.1 для отображения между классами.У меня есть исходный класс, который выглядит следующим образом:

    public class initRequest{
     protected String id;
     protected String[] details
}

У меня есть целевой класс, который выглядит следующим образом:

public class initResponse{
       protected String id;
       protected DetailsObject detObj;
}

public class DetailsObject{
 protected List<String>  details;
}

Поэтому я хочу, чтобы строка в массиве деталей былазаполнено в список в объекте Details.

Я пробовал сопоставление следующим образом:

<mapping wildcard="true" >
  <class-a>initRequest</class-a>
  <class-b>initResponse</class-b>   
  <field>
    <a is-accessible="true">details</a>
    <b is-accessible="true">detObj.details</b>
  </field>
</mapping>

Но я получаю эту ошибку:

Exception in thread "main" net.sf.dozer.util.mapping.MappingException: java.lang.NoSuchFieldException: detObj.details
    at net.sf.dozer.util.mapping.util.MappingUtils.throwMappingException(MappingUtils.java:91)
    at net.sf.dozer.util.mapping.propertydescriptor.FieldPropertyDescriptor.<init>(FieldPropertyDescriptor.java:43)
    at net.sf.dozer.util.mapping.propertydescriptor.PropertyDescriptorFactory.getPropertyDescriptor(PropertyDescriptorFactory.java:53)
    at net.sf.dozer.util.mapping.fieldmap.FieldMap.getDestPropertyDescriptor(FieldMap.java:370)
    at net.sf.dozer.util.mapping.fieldmap.FieldMap.getDestFieldType(FieldMap.java:103)
    at net.sf.dozer.util.mapping.util.MappingsParser.processMappings(MappingsParser.java:95)
    at net.sf.dozer.util.mapping.util.CustomMappingsLoader.load(CustomMappingsLoader.java:77)
    at net.sf.dozer.util.mapping.DozerBeanMapper.loadCustomMappings(DozerBeanMapper.java:149)
    at net.sf.dozer.util.mapping.DozerBeanMapper.getMappingProcessor(DozerBeanMapper.java:132)
    at net.sf.dozer.util.mapping.DozerBeanMapper.map(DozerBeanMapper.java:94)

Как я могусопоставить это так, чтобы оно работало?

Ответы [ 7 ]

3 голосов
/ 08 декабря 2012

Это работает для меня.Я использую версию 5.2.1

 <mapping wildcard="true" >
      <class-a>initRequest</class-a>
      <class-b>initResponse</class-b>   
      <field>
        <a>details</a>
        <b is-accessible="true">detObj.details</b>
      </field>
    </mapping>

Обратите внимание, что "is-accessable" не требуется для.Надеюсь, это поможет

2 голосов
/ 17 июня 2010

Проблема решена ...

  • is-accesible позволяет обновлять объект независимо от модификатора доступа и наличия геттеров / сеттеров (необходимо для объектов, созданных с использованием JAXB)

  • «точечная» нотация для глубокого картирования для доступа к вложенным объектам

Объединение этих двух функций - функция, которая не работает в Dozer (возможно, в более новой версии)

решение ... измените xsd так, чтобы глубокое отображение не требовалось. Это не мое идеальное решение, но оно лучше, чем написание собственного конвертера для каждого объекта

1 голос
/ 16 октября 2010

В случае JaxB, use может загрузить и использовать плагин для генерации сеттеров.Для получения более подробной информации обратитесь к этой ссылке, https://jaxb2 -commons.dev.java.net / collection-setter-injector /

0 голосов
/ 03 августа 2015

Подводя итог, есть следующие варианты для этой проблемы 1) Используйте плагин JaxB, чтобы включить сеттеры, как обсуждал Naveen 2) Использование доступно для таких свойств

Я считаю, что при первом подходе излишне выставляются сеттеры для коллекций / списков, так как вы можете рискнуть установить их с нулем.

Мы решили включить доступность для таких полей (а не для всего класса), чтобы избежать каких-либо побочных эффектов.

Я обсуждал решение на Доступен уровень Dozer Mapping Class

0 голосов
/ 11 августа 2014

Хотя кажется, что вы не можете использовать «доступную» и точечную нотацию вместе, другой подход состоит в том, чтобы разбить ваше глубокое отображение на меньшие отображения.

Мы столкнулись с этой ситуацией с помощью сгенерированного кода JAX-WS.У вас есть списки, которые не имеют методов установки и в нашем случае были глубоко вложенными.Мы нашли наше решение, просто разбив большое глубокое отображение на более мелкие отображения, которые «шли» по нашему пути к тому, что мы хотели.Я попытался объяснить это в своем блоге здесь:

http://btarlton.blogspot.com/2014/08/dozer-deep-nestinga-different-approach.html

Но хитрость заключается в том, чтобы просто обходить дерево объектов с помощью меньших сопоставлений и использовать is-available = "true", когда необходимо получить доступсписок без установщика и использование «this» в качестве имени свойства для продолжения передачи источника.

Надеюсь, это поможет!

0 голосов
/ 16 февраля 2011
<b is-accessible="true">detObj.details</b>

Должен быть заменен на

<b is-accessible="true">DetailsObject.details</b>
0 голосов
/ 11 июня 2010

Я бы предположил, что средства доступа (геттер / сеттер) отсутствуют.Кстати, я думаю, что вам также нужно будет предоставить пустой конструктор для DetailsObject, чтобы dozer мог его создать.

...