2017-08-23 4 views
0

私は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プロパティを除いて正常に処理されます。

次のように私のマッパーと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); 

} 

だから、私は、ネストされたプロパティが自動的に変換を受けることを考えたが、彼らはこのような場合には、私も私に指示コンパイラエラーを取得しないことのように見えます私は変換のためのマッピング方法が必要です:PersonDto map(List<PersonEntity> value)しかし、私はすでにutilsの使用でこれを提供したと思いました。

誰かがアイデアを持っている場合は、適切な回避策を実装するためのヒントを教えてください。

注:私はPersonDtoを返し、私は明示的に書いたが、私のPersonMapperをインスタンス化することはできませんので、その後にNullPointerExceptionがスローされますマッパーを使用するように私のPersonUtilを変更した場合 アプリケーションにのみコンパイルします。

答えて

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); 

} 
+0

グレート。小さなプラグインですが、現在私はMapStructのIntelliJプラグインで作業しています。このようなコードで、 '@ Mapper'または' @ MapperConfig'アノテーションが欠けているというエラーが表示されます。 – Filip

+0

@Filipニース、リリースされるとすぐにそれを試して楽しみにして! :) – blackr0xx

関連する問題