Отображение без учета регистра в Mapstruct

есть ли способ в mapstruct игнорировать регистр полей при отображении. скажем, я хочу отобразить следующие два класса

public class Customer {

    private String ID;

    public String getID() {
        return ID;
    }

    public void setID(String iD) {
        this.ID = iD;
    }
}


public class CustomerDetails {

    private String id;

    public String getId() {
        return ID;
    }

    public void setId(String id) {
        this.id = id;
    }

}

MapStruct не сопоставляет поля автоматически, потому что имена методов получения не совпадают. Есть ли способ настроить MapStruct, чтобы игнорировать регистр полей и автоматически отображать их


person user3817206    schedule 01.04.2020    source источник
comment
Почему имена атрибутов не соответствуют стандартному соглашению об именах Java?   -  person Leonardo Meinerz Ramos    schedule 01.04.2020
comment
некоторые классы генерируются из XSD (в которых некоторые поля являются аббревиатурами)   -  person user3817206    schedule 02.04.2020


Ответы (2)


Можно реализовать пользовательский AccessorNamingStrategy, который будет строчными буквами имени элемента и, таким образом, сделать его нечувствительным к регистру.

e.g.

public class CaseInsensitiveAccessorNamingStrategy extends DefaultAccessorNamingStrategy {

    @Override
    public String getPropertyName(ExecutableElement getterOrSetterMethod) {
        return super.getPropertyName( getterOrSetterMethod ).toLowerCase( Locale.ROOT );
    }

    @Override
    public String getElementName(ExecutableElement adderMethod) {
        return super.getElementName( adderMethod ).toLowerCase( Locale.ROOT );
    }
}
person Filip    schedule 05.04.2020
comment
Спасибо, Филип! Добавлю пару ссылок. Справка в документации о настраиваемой стратегии AccessorNamingStrategy: mapstruct.org/documentation/stable/reference/ html / Пример проекта в репозитории MapStruct: github.com/mapstruct/mapstruct-examples/tree/master/ - person Giovanni P.; 25.04.2020
comment
@GiovanniP. спасибо за ссылки. Есть ли способ применить пользовательский AccessorNamingStrategy только для некоторых классов / пакетов? способ применить пользовательский AccessorNamingStrategy без извлечения его в отдельную банку (т.е. в контексте приложения Spring Boot)? - person WeGa; 12.07.2021

Не уверен, что вы можете настроить mapstruct для сопоставления без учета регистра, но вы всегда можете определить, что должно отображаться следующим образом:

@Mapping(source = "ID", target = "id")
CustomerDetails toCustomerDetails(Customer customer);
person name not found    schedule 01.04.2020
comment
в настоящее время мы делаем это, но проблема в том, что у нас есть сотни полей, которые нам нужно сопоставить между классами xml и json. Пытаемся найти более простой способ сделать это, а также хотим убедиться, что мы не пропустили ни одного элемента. - person user3817206; 01.04.2020
comment
TS ищет их автоматически, и это просто явное сопоставление для одного поля. - person WeGa; 12.07.2021