Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mapstruct可以';使用ObjectFactory时映射属性_Java_Spring_Mapstruct - Fatal编程技术网

Java Mapstruct可以';使用ObjectFactory时映射属性

Java Mapstruct可以';使用ObjectFactory时映射属性,java,spring,mapstruct,Java,Spring,Mapstruct,我需要一些社区帮助来指出我的代码哪里错了…:) 在@ObjectFactory的帮助下,我尝试使用mapstruct在两个实体之间映射字段 实体1: public class ScimUser { @JsonProperty("addresses") @Valid private List<UserAddress> addresses = null; } 制图员: @Mapper(componentModel = "spring", uses = {

我需要一些社区帮助来指出我的代码哪里错了…:)

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

实体1:

public class ScimUser   {

    @JsonProperty("addresses")
    @Valid
    private List<UserAddress> addresses = 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);
    }

}
@组件
公共类地址工厂{
@自动连线
私人CountryMapper CountryMapper;
@自动连线
私有国家知识库国家知识库;
@对象工厂
公共邮政地址(列表地址,@TargetType类类型){
PostalAddress PostalAddress=新的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());
setPostCode(userAddress.getPostalCode());
postalAddress.setState(userAddress.getRegion());
setCity(userAddress.getLocation());
CountryJpa CountryJpa=countryRepository.getCountryByIso2Code(userAddress.getCountry());
如果(countryJpa!=null){
Country Country=countryMapper.fromJPA(countryJpa);
邮资。setCountry(国家);
}
}
退回邮资;
}
@对象工厂
公共列表toUserAddressList(邮寄地址,@TargetType类类型){
UserAddress UserAddress=新的UserAddress();
userAddress.setCountry(address.getCountry().getIso2());
userAddress.setFormatted(“?”);
userAddress.setLocality(address.getCity());
userAddress.setPostalCode(address.getPostCode());
setPrimary(true);
userAddress.setRegion(address.getState());
userAddress.setStreetAddress(address.getAddressLine1());
userAddress.setType(“?”);
返回集合。singletonList(用户地址);
}
}
上面的代码在源代码生成过程中显示此错误:

无法将属性“java.util.List addresses”映射到“PostalAddress PostalAddress”。考虑声明/实现映射方法:“后地址映射(JavaUTILLIST值)”。 无法将属性“PostalAddress PostalAddress”映射到“java.util.List地址”。考虑声明/实现映射方法:“java. UTILISTMAP(PalpalAdvaldValue)”。 这不是我第一次使用这些对象工厂,我真的不知道我做错了什么


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

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

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


我必须强调的是,你在那里做了相当多的手工制图。您可以轻松地提供在单个
用户地址
邮政地址
之间进行映射的方法,只需为集合添加包装器即可。

感谢您的回答,我更了解如何处理这些映射。
@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);
    }

}