Hi, since I not got any answer in stackoverflow, i hope get some answer here :
I have as parent class : User.java , and 2 classes : FacebookUser.java and TwitterUser.javathey are entities that returned depends on the type column in database using DiscriminatorColumn, I want to write correct mapper to map User that could be instance of FacebookUser or TwitterUser. I have the following mapper that seems not works as intended, only Mapping the User parent not the children:
@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);
}Then I use :
UserDTO userDto = UserMapper.INSTANCE.map(user);Classes to map:
@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
}The DTOs:
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
}Also if I have list of users that mixed with Facebook users and Twitter users, or basic user:
Lets say I have the following users:
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);I get only firstName and lastName but not screenName or userId.
Any solution for this?
--
You received this message because you are subscribed to the Google Groups "mapstruct-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mapstruct-users+unsubscribe@googlegroups.com.
To post to this group, send email to mapstruct-users@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
default UserDTO mapChild(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(user);
}
}
default User mapChild(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(userDTO);
}
}
default List<UserDTO> mapChildren(List<User> users) {
List<UserDTO> dtos = new ArrayList<>();
users.forEach(user -> dtos.add(mapChild(user)));
return dtos;
}
@Mapper(config = CentralConfig.class, uses = {UserCardMapper.class})
public interface UserMapper {
public static UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
LocalUser map(UserDTO.LocalUserDTO userDTO);
@InheritInverseConfiguration
UserDTO.LocalUserDTO map(LocalUser user);
List<UserDTO> map(List<User> users);
FacebookUser map(UserDTO.FacebookUserDTO userDTO);
@InheritInverseConfiguration
UserDTO.FacebookUserDTO map(FacebookUser user);
TwitterUser map(UserDTO.TwitterUserDTO userDTO);
@InheritInverseConfiguration
UserDTO.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 UserDTO.FacebookUserDTO) {
return this.map((UserDTO.FacebookUserDTO) userDTO);
} else if (userDTO instanceof UserDTO.TwitterUserDTO) {
return this.map((UserDTO.TwitterUserDTO) userDTO);
} else {
return this.map((UserDTO.LocalUserDTO) userDTO);
}
}
}