【发布时间】:2021-09-15 14:03:41
【问题描述】:
自从尝试让 MapStruct 为 JAXB 生成的类生成有效的映射器以来,我一直在苦苦挣扎。这些类的特殊性在于它们既没有集合的 setter 也没有 adders。例如:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "IndividualType", propOrder = {"addressTypes","pensionTypes"})
public class IndividualType
{
...
@XmlElement(name = "addressType")
protected List<AddressType> addressTypes;
@XmlAttribute(name = "firstName", required = true)
protected String firstName;
...
public List<AddressType> getAddressTypes()
{
if (addressTypes == null) {
addressTypes = new ArrayList<AddressType>();
}
return this.addressTypes;
}
public String getFirstName()
{
return firstName;
}
public void setFirstName(String value)
{
this.firstName = value;
}
...
}
类 avove 有一个 getter 和一个 setter 用于属性(本例中为 firstName),但对于集合(此处为 List)它只有一个 getter。因此,消费者有责任通过 getAddressTypes(add (new AddressType(...)) 进行访问。
此类的 MapStruct 映射器如下:
@Mapper(collectionMappingStrategy = CollectionMappingStrategy.TARGET_IMMUTABLE, uses = {AddressTypeMapper.class}, unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = "spring")
public interface IndividualTypeMapper
{
IndividualType toIndividualType(IndividualEntity individual);
@InheritInverseConfiguration
IndividualEntity fromIndividualType(IndividualType individualType);
}
而MapStruct生成的代码是:
@Override
public IndividualEntity fromIndividualType(IndividualType individualType)
{
if ( individualType == null )
return null;
IndividualEntity individualEntity = new IndividualEntity();
individualEntity.setFirstName( individualType.getFirstName() );
...
return individualEntity;
}
在上面生成的代码中,尽管使用了 TARGET_IMMUTABLE 策略,但只有具有 setter 的属性会被初始化。
有什么建议吗?当然,一个简单的构造函数就可以完美地完成,但由于某种原因,人们似乎更喜欢复杂且非工作的解决方案而不是简单的工作解决方案,因此,我必须使用 MapStruct :-(
非常感谢。
玛丽-法国
【问题讨论】: