Выполнение преобразования часового пояса при использовании BeanUtils.copyProperties
У меня есть отображенный класс модели Hibernate следующим образом,
@Entity
@Table(name = "USER")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "User_SEQ")
@SequenceGenerator(sequenceName = "User_SEQ", allocationSize = 1, name = "User_SEQ")
private Integer id;
private Date createdOn;
}
У меня есть следующий класс модели, который я использую для ответа от REST API. Объект этого класса по существу сериализуется в JSON
public class UserDTO {
private Integer id;
private Date createdOn;
}
Поскольку имена переменных совпадают, я использую BeanUtils.copyProperties для копирования значения всех полей из User в UserDTO (в настоящее время для простоты показаны только 2 поля выше)
Данные хранятся в базе данных по Гринвичу, поэтому в поле createOn содержится TIMESTAMP в GMT. Я хочу вернуть дату в местном часовом поясе, например, "Европа / Копенгаген". Для этого я использую следующий код (используя Apache Commons),
java.util.Date defaultValue = null;
DateConverter dateConverter = new DateConverter(defaultValue);
dateConverter.setTimeZone(TimeZone.getTimeZone("Europe/Copenhagen"));
BeanUtilsBean beanUtilsBean = BeanUtilsBean.getInstance();
beanUtilsBean.getConvertUtils().register(dateConverter, java.util.Date.class);
BeanUtils.copyProperties(userDTO, user);
Код выполняется, но userDTO по-прежнему содержит дату в GMT. преобразование часового пояса не работает. Что мне здесь не хватает?
EDIT1:
Я пытался проверить, вручную передавая дату следующим образом,
@Test
public void testBeanUtilsDateConverter() throws Exception {
System.out.println("\ntestBeanUtilsDateConverter - Start");
Date date = new GregorianCalendar(2014, Calendar.FEBRUARY, 11, 18, 30, 10).getTime();
Date newDate = new Date();
DateConverter converter = new DateConverter();
converter.setTimeZone(TimeZone.getTimeZone("Europe/Copenhagen"));
BeanUtilsBean beanUtilsBean = BeanUtilsBean.getInstance();
beanUtilsBean.getConvertUtils().deregister(java.util.Date.class);
beanUtilsBean.getConvertUtils().register(converter, java.util.Date.class);
System.out.println(newDate);
BeanUtils.copyProperties(newDate, date);
System.out.println(date);
System.out.println(newDate);
System.out.println("testBeanUtilsDateConverter - End");
}
Выход:
testBeanUtilsDateConverter - Start
Fri Jun 02 14:04:08 IST 2017
Tue Feb 11 18:30:10 IST 2014
Tue Feb 11 18:30:10 IST 2014
testBeanUtilsDateConverter - End
Таким образом, BeanUtils определенно копирует дату в цель, но конвертер либо не вызывается, либо по какой-то причине ничего не делает
EDIT2 - Использование пользовательского конвертера
class MyDateConverter implements Converter {
public MyDateConverter() {
System.out.println("Instantiating MyDateConverter");
}
@Override
public Object convert(Class Date, Object value) {
System.out.println("Inside convert()");
if (value == null) {
System.out.println("Value is null");
return (Date) null;
} else {
System.out.println("Doing date conversion");
Date date = new GregorianCalendar(2015, Calendar.JANUARY, 12, 9, 45, 15).getTime();
return date;
}
}
}
@Test
public void testCustomDateConverter() throws Exception {
System.out.println("\ntestCustomDateConverter - Start");
Date date = new GregorianCalendar(2014, Calendar.FEBRUARY, 11, 18, 30, 10).getTime();
Date newDate = new Date();
BeanUtilsBean beanUtilsBean = BeanUtilsBean.getInstance();
beanUtilsBean.getConvertUtils().deregister(java.util.Date.class);
beanUtilsBean.getConvertUtils().register(new MyDateConverter(), java.util.Date.class);
System.out.println(newDate);
BeanUtils.copyProperties(newDate, date);
System.out.println(date);
System.out.println(newDate);
System.out.println("testCustomDateConverter - End");
}
Выход:
testCustomDateConverter - Start
Instantiating MyDateConverter
Fri Jun 02 14:04:09 IST 2017
Tue Feb 11 18:30:10 IST 2014
Tue Feb 11 18:30:10 IST 2014
testCustomDateConverter - End
Опять тот же результат. Пользовательский конвертер создается, но метод convert не вызывается. Я даже попробовал собственный конвертер Long, чтобы проверить, связано ли это с использованием класса Date, но даже это не вызывалось. В части регистрации отсутствует то, что BeanUtils не может вызвать переопределенную функцию преобразования.