Java Mapstruct可以';使用ObjectFactory时映射属性
我需要一些社区帮助来指出我的代码哪里错了…:) 在@ObjectFactory的帮助下,我尝试使用mapstruct在两个实体之间映射字段 实体1: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 = {
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);
}
}