Mapstruct:如何在Source为Null时将目标String默认为空String(两个字段具有相同的名称和类型)Java / Spring

chhqkbe1  于 2023-01-07  发布在  Java
关注(0)|答案(2)|浏览(535)

我有两个具有相同字段名和类型的对象Source和Target。
如果源字段为空,我希望目标字段为“”(空字符串)
我的接口Map看起来像这样(这只是两个字段,我有很多)

@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似乎只是将所有内容都保持为空。
有什么想法吗?我想默认为空字符串的一切

wrrgggsh

wrrgggsh1#

您需要设置NullValuePropertyMappingStrategy(作为Mapper注解的一部分)来定义如何Map空属性。
请参阅空值属性Map策略.html#SET_TO_DEFAULT
String的默认值为"",不需要显式定义。
因此,您的Map器可以简单地如下所示:

@Mapper(
    componentModel = "spring", 
    nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT, 
    nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT
)
public interface MyMapper {

    public Target mapFrom(Source source);

}
fae0ux8s

fae0ux8s2#

当您的源对象具有与目标对象相同的字段,并且您希望管理所有源值(例如,字符串),使其在目标对象中成为空字符串("")时,您可以从MapStruct库创建Map器接口,如下所示:

步骤1:

@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;
  }
}

所有的 * 空到空字符串过程 * 都发生在mapper.update(source, target)方法下。在为你的项目运行mvn clean install之后,你可以检查它在target/generated-sources/annotations/...../SourceToTargetMapperImpl.java文件中的外观和工作方式。

相关问题