我有一个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?我可以以某种方式配置它吗?谢谢你的帮助!
答案 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>
我认为它可以适用于任何数据类型,只需编写更多转换器,或者将此转换器写入智能。