2016-05-31 3 views
2

Я использую Orika 1.4.6, и я бы хотел использовать CustomConverter для отображения одного из моих полей. Когда исходное поле имеет значение null, конвертер, похоже, не вызывается. Вот мой код:Orika: CustomConverter не получил нулевые значения

class From { 
    String source; 
} 

class To { 
    String destination = "defaultValue"; 
} 

public class Mapper extends ConfigurableMapper { 

    private class MyConverter extends CustomConverter<String, String> { 

    @Override 
    public String convert(String source, Type<? extends String> destinationType) { 
     if (null == source) { 
     return "NULL!"; 
     } 
     return "->" + source + "<-"; 
    } 
    } 

    @Override 
    protected void configure(MapperFactory factory) { 

    factory.getConverterFactory().registerConverter("converter", new MyConverter()); 

    factory.classMap(From.class, To.class) 

     .fieldMap("source", "destination") 
     .mapNulls(true) 
     .converter("converter") 
     .add() 

    .register(); 
    } 
} 

Если я отобразить следующий объект:

From from = new From(); //from.source == null 

Mapper mapper = new Mapper(); 
To to = mapper.map(from, To.class); 

System.out.println(to.destination); 

я ожидаю следующий вывод:

NULL! 

Однако я получаю следующее:

null 

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

.mapNulls(true) 

Если я теперь установлен

.mapNulls(false) 

проблема остается такой же, как нулевое значение в поле источника игнорируется который оставляет поле назначения неизменным (в данном случае со значением «defaultValue»).

Можно было бы, например, использовать метод «customize» в сочетании с CustomMapper. Однако это решение намного сложнее в моем реальном приложении, и поэтому решение с CustomConverter кажется гораздо более подходящим.

Кто-нибудь знает, где проблема в этом конкретном примере?

Приветствия, Роберт

+0

Я использую CustomMapper для решения, приемлемого для вас? – Akah

+0

Решение с использованием CustomMapper работает и является правильным. Однако я считаю, что решение, очерченное выше, было бы проще и легче поддерживать в долгосрочной перспективе. Кроме того, мне интересно, является ли это поведение преднамеренным или нет. – Robert

+0

Это было бы хорошим решением, но я не думаю, что преобразователи используются, когда источником является «null». CustomMapper может быть вашим единственным вариантом, но подумайте о том, чтобы спросить у сопровождающего, в последний раз я проверил, что они были активны в списке рассылки Google для проекта. – kab

ответ

1

Наблюдаемое поведение является преднамеренным.

Вместо использования настраиваемого конвертера, который обрабатывает нулевые значения, можно создать ObjectFactory, который обрабатывает создание объекта. Здесь мы можем установить значения по умолчанию и переопределить их, если необходимо (т. Е., Если не-нулевой объект отображается) в пользовательском конвертере. Обратите внимание, что здесь мы должны установить

.mapNulls(false) 

для этой работы.

Благодаря Elaatifi от Orika для этого решения!

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