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>和<代码>颜色< /代码>,那么你应该考虑使用可重用的转换器。