如何使用modelmapper映射字段时应用自定义逻辑

时间:2017-11-15 00:18:01

标签: java modelmapper

如何将自定义逻辑应用于字段映射?在此示例中,我想计算int age中的LocalDate birthdate

public class ModelMapperConfigTest {

    @Data
    public static class Person {
        private LocalDate birthdate;
    }

    @Data
    public static class PersonDto {
        private long age;
    }

    // Test data
    LocalDate birthdate = LocalDate.of(1985, 10, 5);
    long age = 32;
    Clock clock = Clock.fixed(birthdate.plusYears(age).atStartOfDay(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault());

    @Test
    public void should_calc_age() {

        ModelMapper modelMapper = new ModelMapper();
        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);

        // TODO: How to configure the Mapper so that calcBirthdate is used?

        // test that all fields are mapped
        modelMapper.validate();

        // test that the age is calculated
        Person person = new Person();
        person.setBirthdate(birthdate);
        PersonDto personDto = modelMapper.map(person, PersonDto.class);
        assertTrue(personDto.age == age);
    }

    // This method should be used for mapping. In real, this could be a service call
    private long calcBirthdate(LocalDate birthdate) {
        return YEARS.between(birthdate, LocalDate.now(clock));
    }
}

1 个答案:

答案 0 :(得分:0)

您可以使用Converter来实现此目的。在您的情况下,为从Converter<LocalDate, Long>birthdate的映射注册age

这可以通过这样的lambdas完成:

@Test
public void should_calc_age() {

    ModelMapper modelMapper = new ModelMapper();
    modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);

    modelMapper.createTypeMap(Person.class, PersonDto.class)
            .addMappings(mapper ->
                    mapper
                            // This is your converter.
                            // Here you have access to getSource() (birthdate).
                            .using(ctx -> calcBirthdate((LocalDate) ctx.getSource()))

                            // Now define the mapping birthdate to age
                            .map(Person::getBirthdate, PersonDto::setAge));

    // test that all fields are mapped
    modelMapper.validate();

    // test that the age is calculated
    Person person = new Person();
    person.setBirthdate(birthdate);
    PersonDto personDto = modelMapper.map(person, PersonDto.class);
    assertTrue(personDto.age == age);
}