【问题标题】:Mapstruct can't map properties while using ObjectFactoryMapstruct 在使用 ObjectFactory 时无法映射属性
【发布时间】:2018-11-10 00:25:27
【问题描述】:

我需要一些社区帮助来指出我在代码中的错误... :)

我尝试在 @ObjectFactory 的帮助下使用 mapstruct 在 2 个实体之间映射字段。

实体 1:

public class ScimUser   {

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

}

实体 2:

public class User   {

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

}

映射器:

@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);

}

对象工厂:

@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 地址”映射到“PostalAddress postalAddress”。考虑声明/实现一个映射方法:“PostalAddress map(java.util.List value)”。 无法将属性“PostalAddress postalAddress”映射到“java.util.List 地址”。考虑声明/实现一个映射方法:“java.util.List map(PostalAddress value)”。

这不是我第一次为使用这些对象工厂而苦恼,我真的不明白自己做错了什么。

因此,如果有人有想法,我很乐意阅读。 :)

【问题讨论】:

    标签: java spring mapstruct


    【解决方案1】:

    您使用的@ObjectFactory 错误。您要实现的是自定义映射方法。

    @ObjectFactory 需要用于创建目标实例对象。在你的情况下,如果你只是从你的方法中删除 @ObjectFactory@TargetType 那么它应该可以正常工作。

    我必须强调的是,您在那里进行了相当多的手动映射。您可以轻松地提供在单个 UserAddressPostalAddress 之间进行映射的方法,并且只需为集合添加包装器。

    【讨论】:

    • 感谢您的回答,我更了解如何处理这些映射。
    猜你喜欢
    • 2016-04-12
    • 2018-02-11
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多