将可迭代直接映射到不可迭代到DTO

时间:2017-08-23 09:27:39

标签: dto mapstruct

我几天前一直在使用MapStruct 1.1,但还没有达到我的需要。

我想做的是以下内容: 我想将JPA-Entity映射到DTO,以便在Primefaces项目中实现我的属性的更好的视图绑定。

所以我的实体如下:

Patient.java

public class PatientEntity implements Serializable {

    @Id
    private long patid;

    // ...
    // countless properties here
    // ...

    private List<PersonEntity> persons;    // contains a history of persons

    // getters and setters
}

Person.java

public class PersonEntity implements Serializable {

    @Id
    private long personid; // some id

    private String name;

    // other properties + getters/setters
}

我想映射这样的实体:

PatientDto.java

public class PatientDto {
    private long patientNumber;

    private Date birthday;

    private PersonDto latestPersonInfo;

    // some other properties + getters/setters
}

PersonDto.java

public class PersonDto {

    private String name;

    private String surname;

    // some other properties + getters/setters
}

我在GitHub(https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-nested-bean-mappings&amp; https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-iterable-to-non-iterable上的官方示例中编写了Mapper类和类似实用程序,但当我想执行我的测试用例时(只需创建实体) ,然后调用mapper,然后调用assertEquals()单个属性)我得到了PersonMapper的NullPointerException但是PatientMapper成功地完成了它的工作,除了latestPersonInfo属性。

我的Mapper和utils看起来如下:

LatestPerson.java

@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface LatestPerson {

}

PersonUtil.java

// Returns the one person object i need for the further properties
// returns the latest person object
public class PersonUtil {

    @LatestPerson
    public PersonEntity latest(List<PersonEntity> persons) {

        if (persons != null && !persons.isEmpty()) {
            for (PersonEntity person : persons) {
                if (person.getPbisdatum() == null) {
                    return person;
                }
            }
        }

        return null;
    }
}

PatientMapper.java

@Mapper(uses = PersonUtil.class)
public interface PatientMapper {

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

    @Mappings({
        @Mapping(source = "patnr", target = "patientNumber"),
        // other mappings
        @Mapping(source = "persons", target = "latestPersonInfo", qualifiedBy = LatestPerson.class)
    })
    PatientDto fromPatientEntity(PatientEntity patient);

}

PersonMapper.java

public interface PersonMapper {

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

    @Mappings({
        @Mapping(source = "panrede", target = "salutation"),
        @Mapping(source = "ptitel", target = "title"),
        @Mapping(source = "pvorname", target = "name"),
        // other mappings
    })
    PersonDto fromPersonEntity(PersonEntity person);

    @InheritInverseConfiguration
    PersonEntity toPersonEntity(PersonDto personDto);

}

所以,我认为嵌套属性会自动转换,但看起来他们不会在这种情况下,我也会收到编译错误,告诉我需要转换的映射方法:{{1但我想,我已经提供了使用utils。

如果有人有想法,请告诉我或提供实施良好解决方法的提示。

注意: 应用程序仅在我更改 PersonUtil 以返回PersonDto并使用我明确编写的映射器但随后抛出NullPointerException时编译,因为我的PersonMapper无法实例化。

2 个答案:

答案 0 :(得分:0)

我找到了我的解决方案,我只是没有看到我忘记使用PersonMapper注释注释我的@Mapper

但是,如果有人遇到同样的问题或需要相同的功能,那么这种方法就可以了。

更正了PersonMapper类:

<强> PersonMapper.java

@Mapper    // <- I oversaw to add this
public interface PersonMapper {

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

    @Mappings({
        @Mapping(source = "panrede", target = "salutation"),
        @Mapping(source = "ptitel", target = "title"),
        @Mapping(source = "pvorname", target = "name"),
        // other mappings
    })
    PersonDto fromPersonEntity(PersonEntity person);

    @InheritInverseConfiguration
    PersonEntity toPersonEntity(PersonDto personDto);

}

答案 1 :(得分:0)

其他方法是,无需创建Qualifier和Utils类。

PatientMapper.java

你可以直接使用,

@Mappings({
    @Mapping(source = "patnr", target = "patientNumber"),
    @Mapping(target = "latestPersonInfo", expression = "java(PersonMapper.INSTANCE.fromPersonEntity(patient.getPersons().get(0)))")
    })
PatientDto fromPatientEntity(PatientEntity patient);
相关问题