我的模型类(源)中有几个Boolean
字段。我的DTO类的目标字段是String
。我需要将true
映射为Y
,将false
映射为N
。有超过20个Boolean
字段,现在我在使用带有20个@Mapping
选项的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");
}
}
MyMapper.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);
}
答案 0 :(得分:3)
如果我没记错的话,您只需要提供自定义类型转换的具体方法即可。
假设您仍在为Mappers使用抽象类。
@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 Interface默认方法,这也应该可行。
答案 1 :(得分:2)
类似于Map Struct Reference#Invoking Other Mappers,您可以定义(您的Helper)类,例如:
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);
}