【问题标题】:Mapstruct case insensitive mappingMapstruct 不区分大小写的映射
【发布时间】:2020-07-13 15:38:01
【问题描述】:

mapstruct 中有没有办法在映射时忽略字段的大小写。假设我想映射以下两个类

public class Customer {

    private String ID;

    public String getID() {
        return ID;
    }

    public void setID(String iD) {
        this.ID = iD;
    }
}


public class CustomerDetails {

    private String id;

    public String getId() {
        return ID;
    }

    public void setId(String id) {
        this.id = id;
    }

}

MapStruct 不会自动映射字段,因为 getter 方法名称不匹配。有没有办法配置 MapStruct 忽略字段的大小写并自动映射它们

【问题讨论】:

  • 为什么属性的名称不遵循 Java 的标准命名约定?
  • 一些类是从 XSD 生成的(其中一些字段是首字母缩写词)

标签: java mapstruct object-object-mapping


【解决方案1】:

不确定是否可以将 mapstruct 配置为不区分大小写,但您始终可以像这样定义应该映射的内容:

@Mapping(source = "ID", target = "id")
CustomerDetails toCustomerDetails(Customer customer);

【讨论】:

  • 目前我们正在这样做,但问题是我们需要在 xml 和 json 类之间映射数百个字段。试图找出是否有更简单的方法,并希望确保我们不会错过任何元素
  • TS 正在寻找“自动映射它们”的方式,这只是单个字段的显式映射
【解决方案2】:

可以实现自定义AccessorNamingStrategy,将元素名称小写,从而使其不区分大小写。

例如

public class CaseInsensitiveAccessorNamingStrategy extends DefaultAccessorNamingStrategy {

    @Override
    public String getPropertyName(ExecutableElement getterOrSetterMethod) {
        return super.getPropertyName( getterOrSetterMethod ).toLowerCase( Locale.ROOT );
    }

    @Override
    public String getElementName(ExecutableElement adderMethod) {
        return super.getElementName( adderMethod ).toLowerCase( Locale.ROOT );
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-10-04
  • 2017-07-19
  • 2016-12-25
  • 2011-02-18
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2017-01-27
相关资源
最近更新 更多