有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否可以从列表的特定元素映射到self?

鉴于以下类别:

public class Person {
    private String name;
    private List<Role> roles;

    public String getRoleByType(String type){
        for(Role role : roles){
            if(type.equals(role.getType())){
                return role;
            }
        }

        return null;
    }
}

public interface Role {
    public String getType();
}

public class Driver extends Role {
    private String driverLicenseNr;

    public String getType(){
        return "Driver";
    }
}

public class Professional extends Role {
    private String occupation;

    public String getType(){
        return "Professional";
    }
}

public class DriverDTO {
    private String name;
    private String driverLicenseNr;
}

我试图完成的是将人映射到DriverDTO

我试着这样做:

@Mapper
public abstract class DriverMapper {
    
    @Mapping(target = ".", expression = "java(driver.getRoleByType(\"Driver\"))")
    public abstract DriverDTO convert(Person person);

    public abstract void driverToDriverDTO(Driver driver, @MappingTarget DriverDTO driverDto);
}

但是注释处理器不能简单地用它生成代码。抛出nullPointerException。 如果我改为这样做(为了简化而隐藏一些编程细节):

@Mapper
public abstract class DriverMapper {
    
    @Mapping(target = "driverLicenseNr", expression = "java(driver.getRoleByType(\"Driver\").getDriverLicenseNr())")
    public abstract DriverDTO convert(Person person);
}

它可以工作,但我想利用自动映射,在本例中我不会这样做。似乎target="."只适用于使用源中单个对象的简单映射。这是真的还是我选择了错误的道路来解决这个问题


共 (1) 个答案

  1. # 1 楼答案

    使用表达式时,MapStruct不进行任何计算,而是使用生成的代码中的内容

    我建议你做如下事情:

    @Mapper
    public abstract class DriverMapper {
        
        public DriverDTO convert(Person person) {
            if (person == null) {
                return null;
            }
    
            Role role = person.getRoleByType("Driver");
    
            Driver driver = role instanceof Driver ? (Driver) role : null;
    
            return convert(person, driver);
        }
    
        @Mapping(target = ".", source = "driver")
        protected abstract DriverDTO convert(Person person, Driver driver);
    
    }