2015-06-12 4 views
7

Это происходит потому, что LocalDate не JavaBean (он не имеет нулевой ARG конструктор)Как сопоставить java.time.LocalDate с Orika?

Чтобы это исправить, необходимо создать LocalDateConverter:

public class LocalDateConverter extends BidirectionalConverter<LocalDate, LocalDate> { 

    @Override 
    public LocalDate convertTo(LocalDate source, Type<LocalDate> destinationType) { 
    return (source); 
    } 

    @Override 
    public LocalDate convertFrom(LocalDate source, Type<LocalDate> destinationType) { 
    return (source); 
    } 

} 

, а затем зарегистрировать его, добавив следующую строку:

mapperFactory.getConverterFactory().registerConverter(new LocalDateConverter()); 

Как shorcut, вы можете вместо этого зарегистрировать предоставленный «PassThroughConverter», как предложил Адам Михалик так Orika не пытается создать экземпляр нового «LocalDate»:

mapperFactory.getConverterFactory().registerConverter(new PassThroughConverter(LocalDate.class)); 

ответ

6

Это происходит потому, что LocalDate не JavaBean (он не имеет нулевой ARG конструктор)

Чтобы это исправить, необходимо создать LocalDateConverter:

public class LocalDateConverter extends BidirectionalConverter<LocalDate, LocalDate> { 

    @Override 
    public LocalDate convertTo(LocalDate source, Type<LocalDate> destinationType) { 
    return (LocalDate.from(source)); 
    } 

    @Override 
    public LocalDate convertFrom(LocalDate source, Type<LocalDate> destinationType) { 
    return (LocalDate.from(source)); 
    } 

} 

, а затем зарегистрировать его, добавив эта строка:

mapperFactory.getConverterFactory().registerConverter(new LocalDateConverter()); 
14

Еще лучше, поскольку LocalDate является неизменным, нет вред при использовании одного и того же объекта в исходном и целевом компонентах. Вы можете настроить MapperFactory следующим образом:

mapperFactory.getConverterFactory().registerConverter(new PassThroughConverter(LocalDate.class)); 
+0

Источника и цель не являются бобами, и я не вижу, как неизменный объект может быть использован повторно с новым значением, так как это «неизменное» (Неизменные объекты просто объекты, состояние которых (данные объекта) не могут измениться после построения). – Tristan

+0

Вы пробовали запустить его с помощью PassThroughConverter? Насколько я понимаю, вы не хотите иметь LocalDate с новым значением - вы хотите, чтобы целевая локальная база имела то же значение, что и исходная локальная дата. Поскольку LocalDate неизменен, для этого вам не нужно создавать новый объект LocalDate, вы можете использовать тот же объект для цели, что и для источника. –

+0

mmm ok, вы правы, я забыл о моем случае использования. Если это сработает, ваше решение будет чище. Я не знаю, почему я написал «return (LocalDate.from (source)) вместо« return source » – Tristan