Mapstruct映射布尔为String

问题描述 投票:2回答:2

我在我的模型类(源)几个Boolean领域。在我的DTO类中的目标字段是String。我需要映射trueYfalseN。有超过20个Boolean领域,现在我使用与@Mapping选择,这是开销20+ expression注解。必须有一个简单的方法或解决方案,我不知道。任何人都可以帮助简化此?

我使用mapstruct版本1.2.0.Final

source.Java

class Source{
  private Boolean isNew;
  private Boolean anyRestriction;
  // several Boolean fields
}

target.Java

class Target{
  private String isNew;
  private String anyRestriction;
}

helper.Java

class Helper{
  public String asString(Boolean b){
    return b==null ? "N" : (b ? "Y" : "N");
  }
}

my mapper.Java

@Mapper interface MyMapper{
  @Mappings(
    @Mapping(target="isNew", expression="java(Helper.asString(s.isNew()))"
    // 20+ mapping like above, any simple way ? 
  )
  Target map(Source s);
}
java string boolean mapping mapstruct
2个回答
2
投票

类似于Map Struct Reference#Invoking Other Mappers,您可以定义(你的助手)类,如:

public class BooleanYNMapper {

    public String asString(Boolean bool) {
        return null == bool ?
            null : (bool ? 
                "Y" : "N"
            );
    }

    public Boolean asBoolean(String bool) {
        return null == bool ?
            null : (bool.trim().toLowerCase().startsWith("y") ?
                Boolean.TRUE : Boolean.FALSE
            );
    }
}

..和然后在(层次结构)的映射器使用它:

@Mapper(uses = BooleanYNMapper.class)
interface MyMapper{
    Target map(Source s);
    //and even this will work:
    Source mapBack(Target t);
}

3
投票

如果我没有记错,你只需要提供一个自定义类型转换具体方法。 让你还在使用映射器抽象类说。

@Mapper
public abstract class YourMapper {
    @Mappings(...)
    public abstract Target sourceToTarget(final Source source);

    public String booleanToString(final Boolean bool) {
        return bool == null ? "N" : (bool ? "Y" : "N");
    }
}

这应该是可能的,即使与Java 8接口的默认方法。

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