我在我的模型类(源)几个Boolean
领域。在我的DTO类中的目标字段是String
。我需要映射true
为Y
和false
为N
。有超过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);
}
类似于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);
}
如果我没有记错,你只需要提供一个自定义类型转换具体方法。 让你还在使用映射器抽象类说。
@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接口的默认方法。