将可迭代对象直接映射到不可迭代对象到 DTO
Map an iterable to non-iterable directly to DTO
几天来我一直在使用 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
}
我写了 Mapper 类 和一个实用程序,就像在 GitHub (https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-nested-bean-mappings & https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-iterable-to-non-iterable) 的官方示例中描述的那样,但是当我想执行我的测试用例时(简单地创建实体,然后调用映射器,然后调用 assertEquals() 单个属性)我得到了 PersonMapper 的 NullPointerException
但 PatientMapper 成功完成了它的工作,除了 latestPersonInfo
属性.
我的映射器和实用程序如下所示:
最新Person.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);
}
所以,我认为嵌套属性会自动转换,但在这种情况下看起来它们不会,我还收到一个编译器错误,告诉我我需要一个映射方法来进行转换:PersonDto map(List<PersonEntity> value)
但我想,我已经使用实用程序提供了它。
如果有人有想法,请告诉我或提供实施良好解决方法的提示。
注意:
只有当我将 PersonUtil 更改为 return a PersonDto 并使用我明确编写的映射器时,该应用程序才会编译,但随后会抛出 NullPointerException,因为我的 PersonMapper 无法实例化。
我找到了我的解决方案,我只是没有看到我忘记用 @Mapper
注释来注释我的 PersonMapper
。
但是,如果有人曾经遇到过相同的问题或确实需要相同的功能,那么这种方法就可以了。
更正 PersonMapper class:
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);
}
另一种方法是,无需创建 Qualifier 和 Utils class。
在PatientMapper.java
可以直接使用,
@Mappings({
@Mapping(source = "patnr", target = "patientNumber"),
@Mapping(target = "latestPersonInfo", expression = "java(PersonMapper.INSTANCE.fromPersonEntity(patient.getPersons().get(0)))")
})
PatientDto fromPatientEntity(PatientEntity patient);
几天来我一直在使用 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
}
我写了 Mapper 类 和一个实用程序,就像在 GitHub (https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-nested-bean-mappings & https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-iterable-to-non-iterable) 的官方示例中描述的那样,但是当我想执行我的测试用例时(简单地创建实体,然后调用映射器,然后调用 assertEquals() 单个属性)我得到了 PersonMapper 的 NullPointerException
但 PatientMapper 成功完成了它的工作,除了 latestPersonInfo
属性.
我的映射器和实用程序如下所示:
最新Person.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);
}
所以,我认为嵌套属性会自动转换,但在这种情况下看起来它们不会,我还收到一个编译器错误,告诉我我需要一个映射方法来进行转换:PersonDto map(List<PersonEntity> value)
但我想,我已经使用实用程序提供了它。
如果有人有想法,请告诉我或提供实施良好解决方法的提示。
注意: 只有当我将 PersonUtil 更改为 return a PersonDto 并使用我明确编写的映射器时,该应用程序才会编译,但随后会抛出 NullPointerException,因为我的 PersonMapper 无法实例化。
我找到了我的解决方案,我只是没有看到我忘记用 @Mapper
注释来注释我的 PersonMapper
。
但是,如果有人曾经遇到过相同的问题或确实需要相同的功能,那么这种方法就可以了。
更正 PersonMapper class:
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);
}
另一种方法是,无需创建 Qualifier 和 Utils class。
在PatientMapper.java
可以直接使用,
@Mappings({
@Mapping(source = "patnr", target = "patientNumber"),
@Mapping(target = "latestPersonInfo", expression = "java(PersonMapper.INSTANCE.fromPersonEntity(patient.getPersons().get(0)))")
})
PatientDto fromPatientEntity(PatientEntity patient);