如何解决在具有相同属性名称的不同数据类型上使用ModelMapper
我有两个班级,分别是Animal
和AnimalDto
我想使用modelmapper
将Entity转换为DTO,反之亦然。
但是对于一些名称相似的属性,这些类应该具有不同的数据类型。
我该如何实现?
Animal.java
public class Animal {
int category;
String color;
int age;
}
AnimalDto.java
public class AnimalDto {
String category;
int color;
int age;
}
目前,我正在手动进行转换:
class AnimalTransformer {
private static Category[] categories = Category.values();
private static Color[] colors = Color.values();
animalEntityToDto(Animal animal) {
AnimalDto animalDto = new AnimalDto();
animalDto.setAge(animal.getAge());
animalDto.setCategory(categories[animal.getCategory()].toString());
animalDto.setColor(Color.valueOf(animal.getColor()).ordinal());
}
animalDtoToEntity(AnimalDto animalDto) {
Animal animal = new Animal();
animal.setAge(animalDto.getAge());
animal.setCategory(Category.valueOf(animalDto.getCategory()).ordinal());
animal.setColor(colors[animalDto.getColor()].toString());
}
}
解决方法
您提供的示例在流畅度方面可能不是模型映射器的最佳组成部分,尤其是因为转换enum
会遇到一些使用泛型的特殊困难。
无论如何,使用Converter
或通常使用AbstractConverter
都是可能的。
您没有提供枚举示例,因此我创建了最简单的枚举示例:
enum Color {
PINK;
}
和
enum Category {
MAMMAL;
}
要将整数 Animal.category
转换为 String AnimalDto.category
,转换器应类似于:
public class CategoryToStringConverter extends AbstractConverter<Integer,String> {
@Override
protected String convert(Integer source) {
return Category.values()[source].toString();
}
}
并要将 String Animal.color
转换为 Integer AnimalDto.category
,转换器应类似于:
public class ColorToOrdinalConverter extends AbstractConverter<String,Integer> {
@Override
protected Integer convert(String source) {
return Color.valueOf(source).ordinal();
}
}
用法如下:
mm.createTypeMap(Animal.class,AnimalDto.class).addMappings(mapper -> {
mapper.using(new CategoryToStringConverter()).map(Animal::getCategory,AnimalDto::setCategory);
mapper.using(new ColorToOrdinalConverter()).map(Animal::getColor,AnimalDto::setColor);
});
这是从Animal
转换为AnimalDto
的一部分。反之亦然,转换当然需要它自己的映射,我认为这里很清楚。
对于一个类,您现在可以做的更好一些,但是如果您需要在这样的许多地方转换Category
和Color
,那么您应该考虑使用可重用的转换器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。