当前位置: 首页 > 知识库问答 >
问题:

MapSTRt无法为XJC(JAXB)生成的类生成映射器

彭存
2023-03-14

几个小时以来,我一直在努力让MapStruct为JAXB生成的类生成有效的映射器。这些类的特殊性在于,它们既没有集合的setter,也没有集合的adder。例如:

@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和一个属性设置器(本例中为firstName),但对于集合(此处列出),它只有一个getter。因此,消费者有责任通过getAddressTypes(add(new AddressType(...))进行访问。

此类的MapSTRt映射器如下所示:

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

生成的代码是:

@Override
public IndividualEntity fromIndividualType(IndividualType individualType) 
{
  if ( individualType == null )
    return null;
  IndividualEntity individualEntity = new IndividualEntity();
  individualEntity.setFirstName( individualType.getFirstName() );
  ...
  return individualEntity;
}

在上面生成的代码中,尽管使用了TARGET\u不可变策略,但只有具有setter的属性才得到初始化。

有什么建议吗?当然,一个简单的构造函数可以很好地解决问题,但由于某种原因,人们似乎更喜欢复杂的非工作解决方案,而不是简单的工作解决方案,因此,我必须使用MapStruct:-(

事先非常感谢。

玛花纤体

共有1个答案

璩无尘
2023-03-14

它不起作用的原因是因为您使用的是集合映射策略(CollectionMappingStrategy)。TARGET\u不可变。这样,基本上就是告诉MapStruct我的集合目标是不可变的,如果您试图修改getter返回的集合,就会引发异常

我建议删除集合映射策略(collectionMappingStrategy),看看没有它是否可以工作。

 类似资料:
  • 问题内容: 我使用XJC工具为XSD架构生成Java类。当我使用JAXB Marshaller将类编组为XML有效负载时,我在输出XML中缺少“ schemaLocation”参数,但在xsd文件中声明了此参数。如何在输出XML中强制执行“ schemaLocation”参数? 以下是用于代码生成的xsd模式文件的开头: 问候 问题答案: 试试这个:

  • 我有以下xml类型: FaxNumber类型如下所示: 生成的xml应该如下所示: 运行JAXB XJC从XSD生成java类时,它会生成以下类: 但是,我想绑定FaxNumber到这样的复合类: 有没有办法在JAXB绑定xml中定义这样的绑定? 注意:不幸的是,我无法控制并且无法更改XSD

  • 我使用XML模式,并用xjc生成java文件,以便与JAXB一起使用。生成的java文件具有默认的@XmlAccessorType(XmlAccessType。字段)指定。我想改变这一点,使生成的java文件具有带注释的属性访问(@XmlAccessorType(XmlAccessType。属性),并且不在字段级别生成@XmlElement / @XmlAttribute批注。有没有办法通过自定义

  • 这过去适用于所有以前版本的JAXB。我已经升级到JAXB的2.2.7版本,现在抛出以下内容: java.lang.AssertionError:javax.xml.bind.jaxBException-带有链接异常:[com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:1 counts of IllegalAnnotat

  • 使用JAXB从XSD(作为标准分发,我无法控制,也无法更改)生成一些POJO有很多困难。问题似乎与XSD中定义某些类型的方式有关。下面我粘贴了一个在XSD中定义的名为TransactionCodeType的简单类型,它是一个令牌与值的枚举列表(也定义为令牌)的联合。 使用JAXB,生成的输出(见下文)被翻译为Java中的基本类型字符串。我使用的是来自org的最新版本的maven-jaxb2-plu