微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在具有相同属性名称的不同数据类型上使用ModelMapper

如何解决在具有相同属性名称的不同数据类型上使用ModelMapper

我有两个班级,分别是AnimalAnimalDto
我想使用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的一部分。反之亦然,转换当然需要它自己的映射,我认为这里很清楚。

对于一个类,您现在可以做的更好一些,但是如果您需要在这样的许多地方转换CategoryColor,那么您应该考虑使用可重用的转换器。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。