Преобразование сложной сущности в DTO с помощью ModelMapper - PullRequest
0 голосов
/ 28 мая 2020

Я работаю в API отдыха, используя Spring boot. когда я хотел вернуть свою сущность из конечной точки, я понял, что свойства отличаются от того, что мне нужно в моем ответе, поэтому я попытался использовать 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;

}

Единственное изменение состоит в том, что последние два списки состоят из строки, а не объекта

Объекты groupingKeyNames и ruleFilters имеют имя и идентификатор, и мне нужно только имя в списке 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]

Заранее спасибо!

1 Ответ

1 голос
/ 29 мая 2020

Создайте в своем 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;
}
...