Mapstruct - объекту сопоставителя требуется сопоставление значений поля объекта - PullRequest
2 голосов
/ 09 мая 2020

У меня есть объект A, который я пытаюсь сопоставить с B. Теперь у этого A есть перечисление с именем field1 с некоторыми значениями. Я хочу сопоставить их, используя @ValueMappings, с каким-либо другим значением перечисления в B. Ниже приведен мой код до сих пор:

@Mapping(source = "field1", target = "field1", nullValuePropertyMappingStrategy = IGNORE)
@Mapping(source = "field2", target = "field2", nullValuePropertyMappingStrategy = IGNORE)
@ValueMappings({
    @ValueMapping(source = "field1.some1", target = "diff1"),
    @ValueMapping(source = "field1.some2", target = "diff1"),
    @ValueMapping(source = "field1.some3", target = "diff1"),
    @ValueMapping(source = "field1.some4", target = "diff2"),
})
B map(A a);

Когда я пытаюсь его скомпилировать, я получаю сообщение об ошибке:

error: The following constants from the property "A.field1 field1" enum have no corresponding constant in the "B field1" enum and must be be mapped via adding additional mappings: diff1, diff2.

1 Ответ

3 голосов
/ 09 мая 2020

Один из способов решить эту проблему - сделать что-то вроде этого:

@Mapper(componentModel = "spring",  uses = {SomeUtil.class}, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface Mapper {
    @Mapping(source = "field1", target = "field1", nullValuePropertyMappingStrategy = IGNORE)
    @Mapping(source = "field2", target = "field2", nullValuePropertyMappingStrategy = IGNORE)
    B map(A a);
}

И в SomeUtil.class:

@Mapper(componentModel = "spring")
public interface SomeUtil {

    @ValueMappings({
        @ValueMapping(source = "field1.some1", target = "diff1"),
        @ValueMapping(source = "field1.some2", target = "diff1"),
        @ValueMapping(source = "field1.some3", target = "diff1"),
        @ValueMapping(source = "field1.some4", target = "diff2"),
    })
    b.field1 map(a.field1 field);
}
...