Пользовательский установщик для использования в MapStruct - PullRequest
1 голос
/ 20 апреля 2020

Я просматривал документацию MapStruct , но безуспешно.

Я реализую отображение между моими классами Домена и моими классами DTO; используя MapStruct . В моем домене я не хочу использовать сеттеры для своих полей, потому что мы знаем, что сегодня сеттеры плохие (по многим причинам, но это не топи c моего вопроса).

Однако, когда я хочу преобразовать ItemDto в Item, я получаю следующее сообщение:

Error:(17, 21) java: Property "name" has no write accessor in my.example.Item.

Однако в моем классе Item есть метод Business void changeName(String newName), который я хотел бы использовать в моем Mapper.

Код моего Mapper:

@Mapper
public interface MyMapper {

    @Mapping(source="nameDto", target = "name")
    Item map(ItemDto dto);
}

Мой вопрос довольно прост: как указать StructMap для использования changeName в качестве средства записи?

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 20 апреля 2020

Чтобы реализовать что-то подобное, вы должны написать свой собственный AccessorNamingStrategy.

Если ваши доменные объекты следуют одному и тому же шаблону changeXXX, тогда простая реализация может выглядеть следующим образом:

public class CustomAccessorNamingStrategy extends DefaultAccessorNamingStrategy {


    @Override
    public boolean isSetterMethod(ExecutableElement method) {
        String methodName = method.getSimpleName().toString();
        return methodName.startsWith( "change" ) && methodName.length() > 6;
    }

    @Override
    public String getPropertyName(ExecutableElement getterOrSetterMethod) {
        String methodName = getterOrSetterMethod.getSimpleName().toString();
        if ( methodName.startsWith( "change") {
            return IntrospectorUtils.decapitalize( methodName.substring( 6 );
        }
        return super.getPropertyName( getterOrSetterMethod );
    }
}

Конечно, вы можете адаптировать CustomAccessorNamingStrategy под свои нужды. Имейте в виду, что это будет использоваться для всех объектов. Также ItemDto.

Более подробную информацию об этом можно найти здесь в документации MapStruct.

...