Выполнение преобразования часового пояса при использовании 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 не может вызвать переопределенную функцию преобразования.

0 ответов

Другие вопросы по тегам