【问题标题】:MapStruct unable to generate mapper for XJC (JAXB) generated classesMapStruct 无法为 XJC (JAXB) 生成的类生成映射器
【发布时间】: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 :-(

非常感谢。

玛丽-法国

【问题讨论】:

    标签: jaxb mapstruct xjc


    【解决方案1】:

    它不起作用的原因是因为您使用的是CollectionMappingStrategy.TARGET_IMMUTABLE。这样,您基本上是在告诉 MapStruct 我的集合目标是不可变的,如果您尝试修改 getter 返回的集合,则会引发异常。

    我建议删除collectionMappingStrategy,看看没有它是否可以工作。

    【讨论】:

      猜你喜欢
      • 2021-10-12
      • 1970-01-01
      • 2019-12-03
      • 2012-03-31
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多