使用ModelMapper将复杂实体转换为DTO。

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

我正在使用Spring boot的休息API工作,当我想从一个End Point返回我的实体时,我意识到属性与我在响应中需要的不同,所以我试图使用Model Mapper来返回一个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;

}

唯一的变化是,最后两个列表是String的,而不是The Object的。

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

我试着使用Model Mapper,就像这样。

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个回答
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.