Mapstruct 映射布尔值到字符串
Mapstruct mapping Boolean to String
我的模型 class 中有几个 Boolean
字段(来源)。我的 DTO class 中的目标字段是 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);
}
如果我没记错的话,你只需要提供一个自定义类型转换的具体方法即可。
假设您仍在为 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 个接口默认方法,这也应该是可能的。
类似于 Map Struct Reference#Invoking Other Mappers,您可以像这样定义(您的助手)class:
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);
}
我的模型 class 中有几个 Boolean
字段(来源)。我的 DTO class 中的目标字段是 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);
}
如果我没记错的话,你只需要提供一个自定义类型转换的具体方法即可。
假设您仍在为 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 个接口默认方法,这也应该是可能的。
类似于 Map Struct Reference#Invoking Other Mappers,您可以像这样定义(您的助手)class:
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);
}