如何使用推土机将数据类型映射到不同的数据类型?

How to map with dozer a data type to different data type?

我有一个 User 和 UserDTO class 但在 dto class 中我不想使用 LocalDateTime,我想将它转换为 long 类型。 (因为 protobuf 不支持日期)。所以在代码中:

我的用户实体 class:

public class User {
    private String name,password;
    private LocalDateTime date;
//getters-setters, tostring..
}

我的 DTO:

public class UserDTO {
    private String name,password;
    private long date;
//getters-setters, tostring..
}

你看到实体User中的日期是LocalDateTime,而DTO中的日期很长。我想使用这个 dozermapper:

    UserDTO destObject =
            mapper.map(user, UserDTO.class);

将 LocalDateTime 代码更改为长:

private static long setDateToLong(LocalDateTime date) {        
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
    String dateString = date.format(formatter);
    return Long.parseLong(dateString);        
}

映射器是否知道将 LocalDateTime 更改为长?我可以以某种方式配置它吗?感谢您的帮助!

最后我找到了一个解决方案,它是从 LocalDateTime 创建到 String,然后从 String 返回到 LocalDateTime。我必须创建一个转换器:

public class DozerConverter implements CustomConverter {
    @Override
    public Object convert(Object destination, Object source, Class destClass, Class sourceClass) {
        DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        if(source instanceof String) {
            String sourceTime = (String) source;
            return LocalDateTime.parse(sourceTime, formatter);
        } else if (source instanceof LocalDateTime) {
            LocalDateTime sourceTime = (LocalDateTime) source;
            return sourceTime.toString();
        }
        return null;
    }

}

并且在我的自定义 xml 中,我必须像这样添加自定义转换器属性:

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://dozer.sourceforge.net
      http://dozer.sourceforge.net/schema/beanmapping.xsd">
    <mapping>
        <class-a>mypackage.UserDTO</class-a>
        <class-b>mypackage.User</class-b>
        <field custom-converter="mypackage.DozerConverter">
            <a>lastLoggedInTime</a>
            <b>lastLoggedInTime</b>
        </field>
    </mapping>
</mappings>

我认为它可以处理任何数据类型,只需要编写更多的转换器,或者智能地编写这个转换器。