私はMapStruct 1.1で数日間働いており、まだ必要なものを達成していません。iterableをDTOに直接反復できないようにマップする
私がしたいことは次のとおりです。 Primefacesプロジェクトで自分のプロパティのより良いビューバインディングを実現するために、JPA-EntityをDTOにマップしたいとします。
次のように私は私のエンティティを持っている:
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 & https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-iterable-to-non-iterable)で説明しているように私はマッパークラスとユーティリティを書いたが、私はしたいとき私のテストケースを実行するには(単純にエンティティを作成し、マッパーを呼び出してassertEquals()の単一のプロパティを呼び出す)、私はPersonMapperに対してNullPointerException
を取得しますが、PatientMappe rはlatestPersonInfo
プロパティを除いて正常に処理されます。
:
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);
}
だから、私は、ネストされたプロパティが自動的に変換を受けることを考えたが、彼らはこのような場合には、私も私に指示コンパイラエラーを取得しないことのように見えます私は変換のためのマッピング方法が必要です:PersonDto map(List<PersonEntity> value)
しかし、私はすでにutilsの使用でこれを提供したと思いました。
誰かがアイデアを持っている場合は、適切な回避策を実装するためのヒントを教えてください。
注:私はPersonDtoを返し、私は明示的に書いたが、私のPersonMapperをインスタンス化することはできませんので、その後にNullPointerExceptionがスローされますマッパーを使用するように私のPersonUtilを変更した場合 アプリケーションにのみコンパイルします。
グレート。小さなプラグインですが、現在私はMapStructのIntelliJプラグインで作業しています。このようなコードで、 '@ Mapper'または' @ MapperConfig'アノテーションが欠けているというエラーが表示されます。 – Filip
@Filipニース、リリースされるとすぐにそれを試して楽しみにして! :) – blackr0xx