问题描述
有关mapStruct的问题。我有从基础实体扩展类并且不确定如何映射它的情况。这是我的情况。
BaseEntity:
public class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "id")
private Long id;
}
BaseDto:
public class BaseDto {
private Long id;
}
UserEntity:
public class User extends BaseEntity {
private String name;
private String lastName;
private String username;
private String password;
private String profilePicturePath;
}
UserDto:
public class UserDto extends BaseDto {
private String name;
private String lastName;
private String username;
private String password;
private String profilePicturePath;
}
映射器是这样的:
@Mapper(uses = {BaseMapper.class})
public interface UserMapper {
User userDtoToUser(UserDto userDto);
UserDto userToUserDto(User user);
}
BaseMapper:
@Mapper
public interface BaseMapper {
BaseEntity dtoToEntity(BaseDto baseDto);
BaseDto entityToDto(BaseEntity baseEntity);
}
问题是我没有映射ID属性。
谢谢您的时间。
编辑:
没有显示错误,在映射器实现(生成的代码)中,该ID没有映射:
@Override
public User userDtoToUser(UserDto userDto) {
if ( userDto == null ) {
return null;
}
UserBuilder user = User.builder();
user.name( userDto.getName() );
user.lastName( userDto.getLastName() );
user.username( userDto.getUsername() );
user.password( userDto.getpassword() );
user.profilePicturePath( userDto.getProfilePicturePath() );
return user.build();
}
解决方法
我正在猜测(因为您没有输入buider
代码),问题是您的构建器类不包含父类字段。 MapStruct在为映射器生成代码时做一些假设。来自documentation-
BuilderProvider的默认实现假定 以下:
- 该类型具有无参数公共静态生成器创建方法 返回一个生成器。因此,例如,人具有公共静态变量 返回PersonBuilder的方法。
- 构建器类型具有无参数的公共方法(构建方法) 返回正在构建的类型。在我们的示例中,PersonBuilder具有一个 方法返回Person。
- 如果有多种构建方法,MapStruct将寻找 称为build的方法,如果存在该方法,则将使用该方法, 否则会产生编译错误。
如果您使用的是Lombok,则可以使用@SuperBuilder
作为-
@SuperBuilder
@Getter
@ToString
public class UserDto extends BaseDto {
private String name;
private String lastName;
private String username;
private String password;
private String profilePicturePath;
}
@Getter
@SuperBuilder
class BaseDto {
private Long id;
}
@SuperBuilder
@Getter
@ToString
public class User extends BaseEntity {
private String name;
private String lastName;
private String username;
private String password;
private String profilePicturePath;
}
@Setter
@Getter
@SuperBuilder
class BaseEntity {
private Long id;
}
生成的看起来像-
@Override
public User userDtoToUser(UserDto userDto) {
if ( userDto == null ) {
return null;
}
UserBuilder<?,?> user = User.builder();
user.id( userDto.getId() );
user.name( userDto.getName() );
user.lastName( userDto.getLastName() );
user.username( userDto.getUsername() );
user.password( userDto.getPassword() );
user.profilePicturePath( userDto.getProfilePicturePath() );
return user.build();
}