我想使用特定类来升级我的 MapStruct 映射器来删除重复的代码,但我真的不知道如何做到这一点,因为在我的情况下,我必须为每个映射器使用特定类,但我不知道是否可以有一种方法可以使用/传递除我的源和目标之外的其他内容
映射器示例:
@Named("idsToActivity")
default List<Activity> idsToActivity(List<Long> longs) {
return longs.stream().map(id -> {
if (id == null) {
return null;
}
Activity activity = new Activity();
activity.setId(id);
return activity;
}).collect(Collectors.toList());
}
我尝试了类似的方法在我的映射器中使用它:
private List<?> mapperIdToEntity(List<Long> longs){
return longs.stream()
.map(id -> {
if (id == null) {
return null;
}
ClassFromMapstruct entity = new ClassFromMapstruct();
entity.setId(id);
return entity;
}).collect(Collectors.toList());
}
是的,可以在 Mapstruct 映射中添加更多参数,而不仅仅是“源”和“目标”。一个简单的例子如下:
地图绘制者:
public interface TestMapper {
@Mapping(source = "testObject.name", target = "nameInDto")
@Mapping(source = "testObject.age", target = "ageInDto")
@Mapping(source = "someString", target = "someStringInDto")
TestDTO mapToDto(TestObject testObject, String someString);
}
实体
@Data
@AllArgsConstructor
public class TestObject {
private String name;
private Integer age;
}
DTO
@Data
public class TestDTO {
private String nameInDto;
private Integer ageInDto;
private String someStringInDto;
}
单元测试中的概念证明
@Spy
private TestMapper testMapper = Mappers.getMapper(TestMapper.class);
@Test
void mappingTest() {
TestDTO helloWorld = testMapper.mapToDto(new TestObject("aaa",32), "Hello World");
System.out.println(helloWorld);
}
输出:TestDTO(nameInDto = aaa,ageInDto = 32,someStringInDto = Hello World)