Search code examples
javaspring-bootspring-mvcdtomodelmapper

Convert Complex Entity to DTO With ModelMapper


i'm working in a rest API using Spring boot. when i wanted to return my entity from an End Point i realized that the Properties are different from what i need on my response so i tried to use Model Mapper to return a DTO.

My entity is like this:

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;

}

And the DTO that i need Must Be Like this:

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;

}

The only change is that the last two lists are of String instead of The Object

The Objects groupingKeyNames and ruleFilters have a Name and an ID, and i only need the name on the list of DTO so it is a List of Strings

I tried using Model Mapper like this:

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

it works, with all the properties but in the Lists it is returning something like:

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

What could i do so i get a result like this:

groupingKeyNames=[cardHash], ruleFilters=[status]

Thanks in advance!


Solution

  • Create a method into your RuleEntity to do it

        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;
    }