2016-04-04 4 views
1

У меня есть класс, назовем его A с полем Map, которое преобразуется в класс B, который я использую для хранения/извлечения базы данных, в котором это поле сопоставляется с String. Картирование работает при идеальном переходе от A к B. Однако при переходе от B к A я получаю исключение IllegalArgument, в котором говорится, что он не может скрывать строку в карте. Меня смущает, потому что Dozer's documentation говорит, что это работает там, где сказано:Сопоставление строки с картой с помощью Dozer

Кодирование типа данных выполняется автоматически с помощью механизма отображения Dozer. В настоящее время Dozer поддерживает следующие типы конверсий: (все они двунаправленные)

И затем он переходит к списку String to Map как к одной из возможных вещей.

Что мне здесь не хватает, или что мне нужно делать специально? Мои файлы выглядеть следующим образом:

public class ClassA { 
    Map<String, String> field; 

    public Map<String, String> getField() { 
     return field; 
    } 
    public void setField(
      Map<String, String> field) { 
     this.field = field; 
    } 
} 

public class ClassB { 
    String field; 

    public String getField() { 
     return field; 
    } 
    public void setField(String field) { 
     this.field = field; 
    } 
} 

<mapping> 
    <class-a>com.fake.company.name.ClassA</class-a> 
    <class-b>com.fake.company.name.ClassB</class-b> 
</mapping> 
+0

Очень интересно. Может быть, они означают «Карта для карты» там, потому что я не вижу такой вещи в этом списке, и это определенно возможно. –

+0

Я поднял вопрос - https://github.com/DozerMapper/dozer/issues/283. Очевидно, что отображение, по крайней мере, не является автоматическим. –

+0

@ShireResident не уверен, что это достойно вопроса, как указал Марти, решение состоит в том, чтобы просто явно объявить поле. – Atocil

ответ

1

От Map Based Properties section (classes used in documentation), кажется, что в явном виде отображение полей требуется, так как имя поля будет использоваться в качестве ключа для карты.

<mapping> 
    <class-a>com.fake.company.name.ClassA</class-a> 
    <class-b>com.fake.company.name.ClassB</class-b>  
    <field> 
    <a>field</a> 
    <b>field</b> 
    </field> 
</mapping> 

Вы не можете использовать другое значение для ключа как так

<a key="someKeyValue">field</a> 

Однако, если ваша карта имеет несколько пар ключ-значение, вы, вероятно, нужен пользовательский преобразователь (see here for details), так как в противном случае бульдозер не имеет Идея, как восстановить исходную карту из строки.

+0

Это сработало, оно больше не дает мне исключения, и на самом деле оно действительно хорошо реконструирует карту, даже с несколькими парами ключ-значение! Однако по какой-то причине теперь преобразование из Map в String приводит к null в результате. – Atocil

 Смежные вопросы

  • Нет связанных вопросов^_^