我在使用 @Mapping 注释的单字段映射中使用条件和表达式时遇到问题。我需要一些简单的解决方案来检查传入字段的空值和空白值。
我有 2 个接口负责此类检查。
@Qualifier
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface UtilConditions {
}
@UtilConditions
public interface StaticUtil {
@Condition()
@Named("isNotBlank")
static boolean isNotBlank(String value) {
return StringUtils.isNotBlank(value);
}
@Condition()
@Named("isNotNull")
static boolean isNotNull(Object value) {
return value != null;
}
@Condition()
@Named("isCollectionNotEmpty")
static boolean isCollectionNotEmpty(Collection<?> collection) {
return collection != null && !collection.isEmpty();
}
}
这为我提供了一种检查值的优雅方法。
例如
@Mapping(target = "name", conditionQualifiedByName = "isNotBlank")
@Mapping(target = "firstName", conditionQualifiedByName = "isNotBlank")
@Mapping(target = "rateCurrency", conditionQualifiedByName = "isNotBlank",
expression = "java(getCurrencyById(dto.getRateCurrency()))")
public abstract Entity toEntity(EntityDto dto);
public Currency getCurrencyById(String currencyName) {
return currencyRepository.findById(currencyName)
.orElseThrow(() -> new EntityNotFoundException(Currency.class, currencyName));
}
但是Mapstruct不允许在一个映射中使用条件和表达式,conditionQualifiedByName只是忽略。 我还尝试在 @Mapping 注释中使用不同的参数来负责条件和表达式,但没有成功。
请告诉我如何首先使用 StaticUtil 中的 isNotBlank() 方法,以防止将空白参数传递给 getCurrencyById() 方法。
提前感谢您的帮助
Try to use qualifiedBy (or qualifiedByName ) instead expression.
@Qualifier
@Target(ElementType.METHOD)
@Reterntion(RetentionPolicy.CLASS)
public @interface GetCurrencyByID{}
@GetCurrencyByID
public Currency getCurrencyByID(String currencyName){
///method implementation
}
//Your Mapper
@Mapping(target = "rateCurrency",
qualifiedBy=GetCurrencyByID.class,
conditionQualifiedByName = "isNotBlank"
)
MapStruct will apply isNotBlank method first and then getCurrencyByID.