ModelMapper 和树结构
ModelMapper and tree structures
我有一个 tree-like 实体结构,我正尝试使用 ModelMapper 将其映射到 DTO。诀窍是我试图在第一个 parent.
之后打破图表
以下是我正在尝试做的一个例子。我有一个类别实体,它有一个名称和一个 parent 类别。我希望我的 DTO 有一个 link 到它的 parent 但不希望后者有它自己的 parent (这样我就不会得到整个层次结构)
问题是 ModelMapper 没有映射我的 DTO parent,因为它是不同的类型;为了打破递归,我将其声明为 DTO 而不是 CategoryDTO。
如果我 DO 将我的 parent 声明为 CategoryDTO,则映射工作正常,但我会得到我所有的 parents 和 grand parents (我不想要)。
有人知道我该如何解决这个问题吗?
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());
}
}
我已经通过使用转换器自定义我的 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;
}
我有一个 tree-like 实体结构,我正尝试使用 ModelMapper 将其映射到 DTO。诀窍是我试图在第一个 parent.
之后打破图表以下是我正在尝试做的一个例子。我有一个类别实体,它有一个名称和一个 parent 类别。我希望我的 DTO 有一个 link 到它的 parent 但不希望后者有它自己的 parent (这样我就不会得到整个层次结构)
问题是 ModelMapper 没有映射我的 DTO parent,因为它是不同的类型;为了打破递归,我将其声明为 DTO 而不是 CategoryDTO。 如果我 DO 将我的 parent 声明为 CategoryDTO,则映射工作正常,但我会得到我所有的 parents 和 grand parents (我不想要)。
有人知道我该如何解决这个问题吗?
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());
}
}
我已经通过使用转换器自定义我的 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;
}