如何使用推土机将数据类型映射到不同的数据类型?
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>
我认为它可以处理任何数据类型,只需要编写更多的转换器,或者智能地编写这个转换器。
我有一个 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>
我认为它可以处理任何数据类型,只需要编写更多的转换器,或者智能地编写这个转换器。