我有两个对象源和目标,它们具有相同的字段名称和类型。
如果源字段为空,我希望目标为“”(空字符串)
我的接口映射看起来像这样(这只是两个字段,我有很多)
@Mapper(componentModel = "spring", nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)
public interface MyMapper {
@Mappings({
@Mapping(target="medium", defaultExpression="java(\"\")"),
@Mapping(target="origin", defaultExpression="java(\"\")")
})
public Target mapFrom(Source source)
如果源有一个值,则应将其复制,如果源中为空,则在目标中应为“”。
Mapstruct-1.3.0 似乎只是将所有内容保留为空。
有什么想法吗?我希望所有内容都默认为空字符串
您需要设置
NullValuePropertyMappingStrategy
(作为 Mapper
注释的一部分)来定义如何映射 null 属性。
参见 NullValuePropertyMappingStrategy.html#SET_TO_DEFAULT
String
的默认值为""
。您不需要明确定义它。
因此,您的映射器可以简单地如下所示:
@Mapper(
componentModel = "spring",
nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT,
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT
)
public interface MyMapper {
public Target mapFrom(Source source);
}
当您的源对象与目标对象具有相同字段,并且当您想要管理所有源null值(例如对于字符串)以成为目标对象中的空字符串(“”)时,您可以创建来自 MapStruct 库的映射器接口如下:
@Mapper(componentModel = "spring")
public interface SourceToTargetMapper {
Target map(Source source);
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT)
void update(Source source, @MappingTarget Target target);
}
整个技巧是定义
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT
但你不能在 @Mapper 注释中定义它。相反,您必须将其作为参数放置在 update()
方法的 @BeanMapping 注释中。
您可以在 MapStruct 文档中阅读更多相关信息。
因此,您必须在代码中再执行一项操作并使用刚刚实现的“update()”方法:
@Component
public class ClassThatUsingMapper {
private final SourceToTargetMapper mapper;
public Target someMethodToMapObjects(Source source) {
Target target = mapper.map(source);
mapper.update(source, target)
return target;
}
}
所有 null 到空字符串过程 都在
mapper.update(source, target)
方法下进行。为您的项目运行 mvn clean install
后,您可以在 target/generated-sources/annotations/...../SourceToTargetMapperImpl.java
文件中检查它的外观和工作原理。
解决此问题的另一种方法是使用 @Condition
@Condition
default String nullToEmpty(String value) {
return value != null ? value : "";
}
假设字段
medium
和 origin
等是字符串,请执行以下操作:
import org.mapstruct.Condition;
import org.mapstruct.Mapper;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
@Mapper(componentModel = "spring")
public interface MyMapper {
MyMapper INSTANCE = Mappers.getMapper(MyMapper.class);
Target mapFrom(Source source);
@Condition
default boolean isNotNull(String value) {
return value != null;
}
}