Мне нужна помощь сообщества, чтобы указать мне, где я ошибаюсь в своем коде ...:)
Я пытаюсь использовать 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)".
Я не первый раз сталкиваюсь с использованием этих объектных фабрик, и я действительно не понимаю, что яЯ делаю неправильно.
Так что, если у кого-то есть идея, я был бы рад ее прочитать.:)