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

MapStruct-将字段值映射到属性

皇甫心思
2023-03-14

我需要将源类中的字段值映射到字段属性。我可以使用Mapstruct使用@mapper注释的'expression'参数来完成

public class ClassA {

    public ClassA() {
    }

    private String name;
    private String address;

    private ArrayList<RequestFilter> filter;

    public ArrayList<RequestFilter> getFilter() {
        return filter;
    }

    public void setFilter(ArrayList<RequestFilter> filter) {
        this.filter = filter;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}
public class ClassATransform {

    public ClassATransform() {
    }

    private String name;
    private String id;
    private String address;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
}
@Mapper(imports=RequestFilter.class)
public interface ClassAMapper {

    ClassAMapper INSTANCE = Mappers.getMapper(ClassAMapper.class);

    @Mappings({
        @Mapping(target = "name", source = "name"),
        @Mapping(target= "address", source = "address"),
        @Mapping(target = "id",  expression="java(req.getFilter().get(req.getFilter().indexOf(new RequestFilter(\"id\"))).filterValue)")
    })
    ClassATransform classAToDTO(ClassA req);
}
public class RequestFilter {

public RequestFilter() {
}


public RequestFilter(String filterName) {
    this.filterName = filterName;
}


public String filterName;
public String filterValue;
public String filterOperator;
public String joinOperator;
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((filterName == null) ? 0 : filterName.hashCode());
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    RequestFilter other = (RequestFilter) obj;
    if (filterName == null) {
        if (other.filterName != null)
            return false;
    } else if (!filterName.equals(other.filterName))
        return false;
    return true;
    }
}

有没有其他方法可以不使用“表达式”来进行映射?

共有1个答案

薛征
2023-03-14

您可以提供一个自定义方法来为您映射它:

@Mapper
public interface ClassAMapper {

    ClassAMapper INSTANCE = Mappers.getMapper(ClassAMapper.class);

    @Mappings({
        @Mapping(target = "id", source = "req")
    })
    ClassATransform classAToDTO(ClassA req);

    default String mapToid(ClassA req) {
        // null checks
        return reg.getFilter()
                    .stream()
                    .filter( filter -> filter.filterName.equals("id"))
                    .findAny()
                    .orElse(null);
    }
}

顺便说一句。不需要目标相同的映射,因为MapStruct会自动执行此操作。

 类似资料:
  • 我把这三门课分别放在不同的文件中 我有下面的映射器 这目前仅映射lastName并起作用,我想将Book中的作者字符串映射为 我怎么能这么做?我在MapStruct文档中找不到任何东西。

  • “”“@Data@Builder(toBuilder=true)@allargsconstuctor@noargsconstuctor public class ServiceAddress{private String addLine1;private String addLine2;private String city;private String state;private String

  • “想要解决方案B” 有什么办法可以做到这一点吗?

  • 假设我有这些实体: null

  • 有没有什么方法可以将嵌套的JSON值映射到字段而不需要额外的类?我有一个JSON响应 但是在中,我只需要值。因此,我决定创建Kotlin数据类,并尝试使用注释的选项 下面的代码正在工作 我有几个嵌套值,为它们创建额外的类是相当夸张的。还有比为节点创建嵌套类更好的方法吗?

  • 我想映射2个模型,其中每个模型都有几乎相同的枚举。让我展示: 第一个模型有枚举: 第二个模型具有枚举: 我有这样的自定义映射方法: 然后我用: 但是你可以得到: 我还创建了枚举映射器,如: 但我不需要单独设置,只希望枚举字段映射到内部映射中。简单地说,当我做枚举时,也应该映射。 谢谢 p、 对不起我的英语,希望我的问题有意义:)