Java 在具有相同属性名称的不同数据类型上使用ModelMapper
我有两门课,分别是Java 在具有相同属性名称的不同数据类型上使用ModelMapper,java,spring-boot,model,converters,modelmapper,Java,Spring Boot,Model,Converters,Modelmapper,我有两门课,分别是Animal和AnimalDto 我想使用ModelMapper将实体转换为DTO,反之亦然。 但是对于一些具有相似名称的属性,类应该具有不同的数据类型。 我如何做到这一点 Animal.java public class Animal { int category; String color; int age; } public class AnimalDto { String category;
Animal
和AnimalDto
我想使用
ModelMapper
将实体转换为DTO,反之亦然。但是对于一些具有相似名称的属性,类应该具有不同的数据类型。
我如何做到这一点 Animal.java
public class Animal {
int category;
String color;
int age;
}
public class AnimalDto {
String category;
int color;
int age;
}
AnimalDto.java
public class Animal {
int category;
String color;
int age;
}
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
s在使用泛型时有一些特殊困难
无论如何,这在Converter
或通常AbstractConverter
中都是可能的
您没有提供枚举示例,因此我创建了最简单的示例枚举:
enum Color {
PINK;
}
及
要将整数动物.category
转换为字符串动物.category
,转换器可以如下所示:
public class CategoryToStringConverter extends AbstractConverter<Integer, String> {
@Override
protected String convert(Integer source) {
return Category.values()[source].toString();
}
}
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);
});
用法如下:
public class CategoryToStringConverter extends AbstractConverter<Integer, String> {
@Override
protected String convert(Integer source) {
return Category.values()[source].toString();
}
}
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
的一部分。反之亦然,转换当然需要自己的映射,我在这里不做介绍,因为我认为这一点已经很清楚了
对于一个类,你现在做的方法可能会更好,但是如果你需要在这样的很多地方转换<代码>类别< /C>和<代码>颜色< /代码>,那么你应该考虑使用可重用的转换器。