我正在尝试使用Mapstruct将源对象映射到目标列表。这样做的干净的mapstruct方法应该是什么?
下面是我的DTO。
源DTO
@Data
class Source
{
String a;
String b;
String C;
}
目标DTO
@Data
class Target
{
String name;
List<Child> customList;
}
@Data
class Child
{
String attr1;
boolean attr2;
}
我正面临Mapper类的问题。尝试实现类似以下的功能。
public interface CustomMapper
{
@Mapper(target="customList" expression="java(new Child(a,false))"
@Mapper(target="customList" expression="java(new Child(b,true))"
@Mapper(target="customList" expression="java(new Child(c,false))"
Target sourceToTarget(Source source);
}
我不想使用下面的qualifiedBy函数来实现此目的,因为所有转换都需要为每个元素编码。
List<Child> toList(Source source)
{
List<Child> customList = new ArrayList<Child>();
customList.add(new Child(source.getA(),false));
customList.add(new Child(source.getB(),true));
customList.add(new Child(source.getC(),false));
return customList;
}
答案 0 :(得分:2)
我有一个类似的用例,我想将Single Object
转换为List
对象。
由于这些都是非常自定义的要求,因此mapstruct
很难为此类用例提供一些API。
我最终像这样使用default method
来实现
@Mapper(componentModel = "spring")
interface MyMapper {
default List<SomeObject> from(SourceObject sourceObject) {
//Add Mappig logic here
//return the list
}
}
//如果要使用某些映射器进行映射
@Mapper(componentModel = "spring")
public abstract class SomeArrayMapper {
@Autowired
SomeMapper mapper;
public SomeUser[] from(SingleObject singleObject) {
SomeUsers[] Users = new SomeUser[1];
Users[0] = mapper.toUser(singleObject);;
return Users ;
}
}
在某些情况下,装饰器也很有用,看看here
答案 1 :(得分:0)
在MapStruct中,目前尚无干净的方法。 MapStruct正在考虑将bean tot地图映射。参见此处:https://github.com/mapstruct/mapstruct/pull/1744,一旦实施,可能会有所帮助。
但是,如果您确实有很多属性,并且这是一个反复出现的问题,并且您不喜欢反射(如我一样),则可能需要尝试进行代码生成并进行DIY。我前不久发布了一个用于在此处生成映射器存储库的示例:https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-mapper-repo,但是学习曲线有些陡峭。.抱歉
答案 2 :(得分:0)
我用一个表达式来解决这个问题。表达式是执行映射(对于对象,对于字符串是直接的),然后将其转换为列表。
@Mapping(target = "names", expression = "java(Arrays.asList(map(source.getName())))")
TargetObject map(SourceObject source);
TargetName map(SourceName source)
您需要在@Mapper定义中导入“ Arrays”类,如下所示。
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = "spring", imports = {Arrays.class})