2016-09-29 4 views
3

私は親クラスとして持つオブジェクトFacebookUser.javaTwitterUser.java彼らは、私が正しいマッパーを書きたい返さDiscriminatorColumnを使用して、データベースの種類]列に依存エンティティですmap FacebookUserまたはTwitterUserのインスタンスになるユーザー。MapStruct一般的な地図や子どものマッピングを組み合わせリストは

UserDTO userDto = UserMapper.INSTANCE.map(user); 

クラスをマッピングするために:

@Entity 
@Table(name = "users") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING, length = 10) 
@DiscriminatorValue(value = "Local") 
public class User { 
    @Column 
    private String firstName; 
    @Column 
    private String lastName; 
    ///... setters and getters 
} 

@Entity 
@DiscriminatorValue(value = "Facebook") 
public class FacebookUser extends User { 
    @Column 
    private String userId; 
    ///... setters and getters 
} 

@Entity 
@DiscriminatorValue(value = "Twitter") 
public class TwitterUser extends User { 
    @Column 
    private String screenName; 
    ///... setters and getters 
} 

@Mapper 
public interface UserMapper { 
    public static UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); 

    User map(UserDTO userDTO); 

    @InheritInverseConfiguration 
    UserDTO map(User user); 

    List<UserDTO> map(List<User> users); 

    FacebookUser map(FacebookUserDTO userDTO); 

    @InheritInverseConfiguration 
    FacebookUserDTO map(FacebookUser user); 

    TwitterUser map(TwitterUserDTO userDTO); 

    @InheritInverseConfiguration 
    TwitterUserDTO map(TwitterUser user); 

} 

は、その後、私は使用します。私が意図したとおり、唯一User親ではない子供のマッピング作品ではないと思われる以下のマッパーを持っていますDTO:

public class UserDTO { 
    private String firstName; 
    private String lastName; 
    ///... setters and getters 
} 

public class FacebookUserDTO extends UserDTO { 
    private String userId; 
    ///... setters and getters 
} 

public class TwitterUserDTO extends UserDTO { 
    private String screenName; 
    ///... setters and getters 
} 
私はFacebookのユーザーとTwitterユーザーと混合したユーザーのリスト、または基本的なユーザーがあれば

はまた:

を、私は、次のユーザーがいるとしましょう:

User user = new User ("firstName","lastName"); 
User fbUser = new FacebookUser ("firstName","lastName","userId"); 
User twUser = new TwitterUser ("firstName","lastName","screenName"); 

List<User> users = new ArrayList<>(); 
users.add(user); 
users.add(fbUser); 
users.add(twUser); 

//Then: 

List<UserDTO> dtos = UserMapper.INSTANCE.map(users); 

は私だけfirstNamelastNameではなくscreenNameを取得しますまたはuserId

これにはどのような解決策がありますか?

答えて

3

は現在、そのmapstructのための機能としてはまだその利用できないようです。Support for Type-Refinement mapping (or Downcast Mapping)

私は自分のGoogleグループでの質問質問:https://groups.google.com/forum/?fromgroups#!topic/mapstruct-users/PqB-g1SBTPg

を、私はインターフェイス内default方法を使用して手動でマッピングを行う必要があることがわかりました( javaの場合8)。

だから、私はもう一つの空のクラスに親クラスの子を記述し、適用はほとんどありませんでしたマッピング親のための別の問題だ:

に次のようになるので、コード:

@Mapper 
public interface UserMapper { 
    public static UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); 

    LocalUser map(LocalUserDTO userDTO); 

    @InheritInverseConfiguration 
    LocalUserDTO map(LocalUser user); 


    List<UserDTO> map(List<User> users); 

    FacebookUser map(FacebookUserDTO userDTO); 

    @InheritInverseConfiguration 
    FacebookUserDTO map(FacebookUser user); 

    TwitterUser map(TwitterUserDTO userDTO); 

    @InheritInverseConfiguration 
    TwitterUserDTO map(TwitterUser user); 

    default UserDTO map(User user) { 

     if (user instanceof FacebookUser) { 
      return this.map((FacebookUser) user); 
     } else if (user instanceof TwitterUser) { 
      return this.map((TwitterUser) user); 
     } else { 
      return this.map((LocalUser) user); 
     } 
    } 

    @InheritInverseConfiguration 
    default User map(UserDTO userDTO) { 
     if (userDTO instanceof FacebookUserDTO) { 
      return this.map((FacebookUserDTO) userDTO); 
     } else if (userDTO instanceof TwitterUserDTO) { 
      return this.map((TwitterUserDTO) userDTO); 
     } else { 
      return this.map((LocalUserDTO) userDTO); 
     } 
    } 

} 
関連する問題