Mapstruct:当源为空时如何将目标字符串默认为空字符串(两个字段具有相同的名称和类型)Java / Spring

问题描述 投票:0回答:3

我有两个对象源和目标,它们具有相同的字段名称和类型。

如果源字段为空,我希望目标为“”(空字符串)

我的接口映射看起来像这样(这只是两个字段,我有很多)

@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 似乎只是将所有内容保留为空。

有什么想法吗?我希望所有内容都默认为空字符串

java mapstruct
3个回答
5
投票

您需要设置

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);

}

0
投票

当您的源对象与目标对象具有相同字段,并且当您想要管理所有源null值(例如对于字符串)以成为目标对象中的空字符串(“”)时,您可以创建来自 MapStruct 库的映射器接口如下:

步骤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 文档中阅读更多相关信息。

第2步:

因此,您必须在代码中再执行一项操作并使用刚刚实现的“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
文件中检查它的外观和工作原理。


0
投票

解决此问题的另一种方法是使用 @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;
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.