【问题标题】:Convert Complex Entity to DTO With ModelMapper使用 ModelMapper 将复杂实体转换为 DTO
【发布时间】:2020-05-28 20:42:41
【问题描述】:

我正在使用 Spring 启动的 rest API 工作。 当我想从端点返回我的实体时,我意识到属性与我在响应中需要的不同,所以我尝试使用模型映射器返回一个 DTO。

我的实体是这样的:

public class RuleEntity {

private String ruleId;
private String bankDecision;
private String aggregatorFunctionType;
private String limitOperatorType;
private double limitRule;
private Integer windowMinutes;
private Integer layer;
private String expressionRule;
private String status;
private List<GroupingKeyName> groupingKeyNames;
private List<RuleFilter> ruleFilters;

}

我需要的 DTO 必须是这样的:

public class RuleDTO {

private String ruleId;
private String bankDecision;
private String aggregatorFunctionType;
private String limitOperatorType;
private double limitRule;
private Integer windowMinutes;
private Integer layer;
private String expressionRule;
private String status;
private List<String> groupingKeyNames;
private List<String> ruleFilters;

}

唯一的变化是最后两个列表是字符串而不是对象

对象 groupingKeyNames 和 ruleFilters 有一个名称和一个 ID,我只需要 DTO 列表中的名称,因此它是一个字符串列表

我尝试像这样使用模型映射器:

ModelMapper modelMapper = new ModelMapper();
    RuleSetModel ruleSetModel =  modelMapper.map(ruleSetEntity, RuleSetModel.class);

它适用于所有属性,但在列表中它返回如下内容:

groupingKeyNames=[GroupingKeyName(groupingKeyId=1, name=cardHash)], ruleFilters=[RuleFilter(ruleFilterId=1, name=status)]

我该怎么做才能得到这样的结果:

groupingKeyNames=[cardHash], ruleFilters=[status]

提前致谢!

【问题讨论】:

标签: java spring-boot spring-mvc dto modelmapper


【解决方案1】:

在您的 RuleEntity 中创建一个方法来执行此操作

    public RuleDTO dto() {
    // config to skip 
    PropertyMap<RuleEntity, RuleDTO> propertyMap = new PropertyMap<RuleEntity, RuleDTO>() {
        @Override
        protected void configure() {
            skip(destination.getGroupingKeyNames());
            skip(destination.getRuleFilters());
        }
    };

    RuleDTO ruleDTO = new RuleDTO();
    ModelMapper modelMapper = new ModelMapper();
    modelMapper.getConfiguration().setPropertyCondition(Conditions.isNotNull());
    modelMapper.addMappings(propertyMap);
    modelMapper.map(this,ruleDTO);

    if (!this.groupingKeyNames.isEmpty()) {
        ruleDTO.getGroupingKeyNames().clear();
        List<String> tmpGroupingKeyNames = new ArrayList<>();
        this.getGroupingKeyNames().forEach(itemDTO -> {
            tmpGroupingKeyNames.add(itemDTO.name);
        });
        ruleDTO.getGroupingKeyNames().addAll(tmpGroupingKeyNames);
    }

    if (!this.ruleFilters.isEmpty()) {
        ruleDTO.getRuleFilters().clear();
        List<String> tmpRuleFilters = new ArrayList<>();
        this.getRuleFilters().forEach(itemDTO -> {
            tmpRuleFilters.add(itemDTO.name);
        });
        ruleDTO.getRuleFilters().addAll(tmpRuleFilters);
    }
    return ruleDTO;
}

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    相关资源
    最近更新 更多