0

我有一个树状的实体结构,我正在尝试使用 ModelMapper 将其映射到 DTO。诀窍是我试图在第一个父母之后打破图表。

以下是我正在尝试做的一个例子。我有一个具有名称和父类别的类别实体。我希望我的 DTO 有一个指向它的父级的链接,但不希望后者有它自己的父级(这样我就不会得到整个层次结构)

问题是 ModelMapper 没有映射我的 DTO 的父级,因为它的类型不同;我将它声明为 DTO 而不是 CategoryDTO 以中断递归。如果我确实将我的父母声明为 CategoryDTO,则映射工作正常,但我会得到我所有的父母和祖父母(我不想要)。

任何人都知道我该如何解决这个问题?

import java.util.UUID;

import org.junit.Assert;
import org.junit.Test;
import org.modelmapper.ModelMapper;

public class CategoryTest {

    public static class Category {
        private String uid = UUID.randomUUID().toString();
        private String name;
        private Category parent;

        public Category () {}

        public Category(String name, Category parent) {
            this.name = name;
            this.parent = parent;
        }

        public String getUid() {return uid;}
        public void setUid(String uid) {this.uid = uid;}
        public String getName() {return name;}
        public void setName(String name) {this.name = name;}
        public Category getParent() {return parent;}
        public void setParent(Category parent) {this.parent = parent;}
    }

    public static class DTO {
        private String uid;
        private String name;

        public String getUid() {return uid;}
        public void setUid(String uid) {this.uid = uid;}
        public String getName() {return name;}
        public void setName(String name) {this.name = name;}
    }

    public static class CategoryDTO extends DTO {
        private DTO parent;

        public DTO getParent() {return parent;}
        public void setParent(DTO parent) {this.parent = parent;}
    }

    @Test
    public void simpleTest() {
        Category dto = new Category("Test1",null);

        CategoryDTO entity = new ModelMapper().map(dto, CategoryDTO.class);

        Assert.assertEquals("Test1", entity.getName());
        Assert.assertEquals(dto.getUid(), entity.getUid());
    }

    @Test
    public void withParentTest() {
        Category dto = new Category("child",new Category("root", null));

        CategoryDTO entity = new ModelMapper().map(dto, CategoryDTO.class);

        Assert.assertEquals("child", entity.getName());
        Assert.assertEquals(dto.getUid(), entity.getUid());
        Assert.assertNotNull(entity.getParent());
    }
}
4

1 回答 1

1

我已经设法通过使用转换器自定义我的 ModelMapper 来解决我的问题。我的 ModelMapper 现在通过调用此方法获取:

private ModelMapper getModelMapper() {
    ModelMapper map = new ModelMapper();
    map.addConverter(new AbstractConverter<Category, AbstractDTO>() {

        @Override
        protected AbstractDTO convert(Category source) {
            if (source == null) return null;

            AbstractDTO dto = new AbstractDTO();
            dto.setUid(source.getUid());
            dto.setName(source.getName());
            return dto;
        }

    });
    return map;
}
于 2015-12-11T15:06:19.757 回答