MapStruct文档中有关于为NullValueMappingStrategy.RETURN_DEFAULT选择的明智默认值的说法:
Bean映射:将返回一个“空”目标Bean,其中包含 常量和表达式除外,它们将在以下情况时填充 礼物。
原语:将返回原语的默认值,例如 boolean为false或int为0。
Iterables / Arrays:将返回一个空的Iterable。
地图:将返回一个空地图。
问题是,我们希望能够在@Mapper级别上指定,例如,Iterables应该具有NullValueMappingStrategy.RETURN_DEFAULT而不是基元。这样做的原因是,对于我们的用例,空的Iterable是明智的默认值,但对于int而言,0不是明智的默认值。我们希望不必例如声明:
@IterableMapping(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)
对于我们正在映射的每个可迭代对象。
MapStruct是否提供一种在文档中找不到的干净方法?
答案 0 :(得分:0)
我认为以上行实际上是文档中的复制粘贴错误。需要说明的是:NullValueMappingStrategy
仅适用于映射方法的参数。不谈豆属性。在豆类映射方法中不可能将原始参数定义为源。
但是可以将非bean定义为bean映射方法的源。类似于下面的mapFrom
方法:
package org.mapstruct.ap.test.bugs._xyz;
import java.util.List;
import org.mapstruct.Mapper;
import org.mapstruct.NullValueMappingStrategy;
import org.mapstruct.factory.Mappers;
@Mapper( nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)
public interface XyzMapper {
XyzMapper INSTANCE = Mappers.getMapper(XyzMapper.class);
Target map(Source source);
Target mapFrom( Integer myInt, List<Integer> myList);
class Source {
private int myInt;
private List<Integer> myList;
public int getMyInt() {
return myInt;
}
public void setMyInt(int myInt) {
this.myInt = myInt;
}
public List<Integer> getMyList() {
return myList;
}
public void setMyList(List<Integer> myList) {
this.myList = myList;
}
}
class Target {
private int myInt;
private List<Integer> myList;
public int getMyInt() {
return myInt;
}
public void setMyInt(int myInt) {
this.myInt = myInt;
}
public List<Integer> getMyList() {
return myList;
}
public void setMyList(List<Integer> myList) {
this.myList = myList;
}
}
}
使用NullValueMappingStrategy.RETURN_DEFAULT
时,mapFrom将返回空的Target
,如文档中所指定。
应从与NullValueMappingStrategy相关的文档中删除此行:Primitives: the default values for primitives will be returned, e.g. false for boolean or 0 for int.