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

时间:2017-04-19 14:35:36

标签: java dozer

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

我的用户实体类:

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将代码更改为long:

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

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

1 个答案:

答案 0 :(得分:0)

最后我发现了一个从LocalDateTime到String并从String返回到LocalDateTime的sollution。我必须创建一个转换器:

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>

我认为它可以适用于任何数据类型,只需编写更多转换器,或者将此转换器写入智能。