地图结构! @Mapping,在一个 @Mapping 中使用 conditionQualifiedByName 和表达式参数

问题描述 投票:0回答:1

我在使用 @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() 方法。

提前感谢您的帮助

java spring mapping
1个回答
0
投票
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. 
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.