Mapstruct не может отобразить свойства при использовании ObjectFactory - PullRequest
0 голосов
/ 31 мая 2018

Мне нужна помощь сообщества, чтобы указать мне, где я ошибаюсь в своем коде ...:)

Я пытаюсь использовать mapstruct для отображения полей между двумя сущностями с помощью @ObjectFactory.

Сущность 1:

public class ScimUser   {

    @JsonProperty("addresses")
    @Valid
    private List<UserAddress> addresses = null;

}

Сущность 2:

public class User   {

    @JsonProperty("postalAddress")
    private PostalAddress postalAddress = null;

}

Mapper:

@Mapper(componentModel = "spring", uses = { AddressFactory.class })
public interface ScimUserMapper {

    @Mapping(target = "postalAddress", source = "scimUser.addresses")
    User toUser(ScimUser scimUser);

    @Mapping(target = "addresses", source = "user.postalAddress")
    ScimUser toScimUser(User user);

}

ObjectFactory:

@Component
public class AddressFactory {

    @Autowired
    private CountryMapper countryMapper;

    @Autowired
    private CountryRepository countryRepository;

    @ObjectFactory
    public PostalAddress toPostalAddress(List<UserAddress> addresses, @TargetType Class<PostalAddress> type) {
        PostalAddress postalAddress = new PostalAddress();
        if (addresses != null && !addresses.isEmpty()) {
            UserAddress userAddress = addresses.stream().filter(UserAddress::isPrimary).findFirst().orElse(null);
            if (userAddress == null) {
                userAddress = addresses.get(0);
            }
            postalAddress.setAddressLine1(userAddress.getStreetAddress());
            postalAddress.setPostCode(userAddress.getPostalCode());
            postalAddress.setState(userAddress.getRegion());
            postalAddress.setCity(userAddress.getLocality());
            CountryJpa countryJpa = countryRepository.getCountryByIso2Code(userAddress.getCountry());
            if (countryJpa != null) {
                Country country = countryMapper.fromJPA(countryJpa);
                postalAddress.setCountry(country);
            }
        }
        return postalAddress;
    }

    @ObjectFactory
    public List<UserAddress> toUserAddressList(PostalAddress address, @TargetType Class<List<UserAddress>> type) {
        UserAddress userAddress = new UserAddress();
        userAddress.setCountry(address.getCountry().getIso2());
        userAddress.setFormatted("?");
        userAddress.setLocality(address.getCity());
        userAddress.setPostalCode(address.getPostCode());
        userAddress.setPrimary(true);
        userAddress.setRegion(address.getState());
        userAddress.setStreetAddress(address.getAddressLine1());
        userAddress.setType("?");

        return Collections.singletonList(userAddress);
    }

}

Приведенный выше код возвращает мне эту ошибку во время генерации исходного кода:

Невозможно отобразить свойство "java.util.List address" в "PostalAddress postalAddress".Попробуйте объявить / реализовать метод отображения: «Карта почтового адреса (значение java.util.List)».Невозможно сопоставить свойство «PostalAddress postalAddress» с «java.util.List address».Попробуйте объявить / реализовать метод сопоставления: "java.util.List map (Значение PostalAddress)".

Я не первый раз сталкиваюсь с использованием этих объектных фабрик, и я действительно не понимаю, что яЯ делаю неправильно.

Так что, если у кого-то есть идея, я был бы рад ее прочитать.:)

1 Ответ

0 голосов
/ 31 мая 2018

Вы используете @ObjectFactory неправильно.То, чего вы хотите добиться, - это собственный метод сопоставления.

@ObjectFactory необходимо использовать для создания целевого объекта экземпляра.В вашем случае, если вы просто удалите @ObjectFactory и @TargetType из вашего метода, тогда он должен работать правильно.

Я должен подчеркнуть, что вы делаете довольно ручное отображение там.Вы можете легко предоставить методы для отображения между отдельными UserAddress и PostalAddress и просто добавить оболочки для коллекций.

...