gpt4 book ai didi

java - 如何在 MapStruct 中映射扩展类

转载 作者:行者123 更新时间:2023-12-03 19:06:26 25 4
gpt4 key购买 nike

有关于mapStruct的问题。我有从基础实体扩展类但不知道如何映射它的情况。这是我的情况。
基本实体:

public class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "id")
private Long id;
}
BaseDto:
public class BaseDto {

private Long id;
}
用户实体:
public class User extends BaseEntity {
private String name;
private String lastName;
private String username;
private String password;
private String profilePicturePath;
}
用户Dto:
public class UserDto extends BaseDto {
private String name;
private String lastName;
private String username;
private String password;
private String profilePicturePath;
}
而mapper是这样的:
@Mapper(uses = {BaseMapper.class})
public interface UserMapper {

User userDtoToUser(UserDto userDto);

UserDto userToUserDto(User user);
}
basemap :
@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 -

The default implementation of the BuilderProvider assumes thefollowing:


  • 该类型具有无参数的公共(public)静态构建器创建方法
    返回一个构建器。因此,例如 Person 有一个公共(public)静态
    返回 PersonBuilder 的方法。
  • builder 类型有一个无参数的公共(public)方法(build 方法)
    返回正在构建的类型 在我们的示例中 PersonBuilder 有一个
    方法返回人。
  • 如果有多个构建方法,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();
    }

    关于java - 如何在 MapStruct 中映射扩展类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63546495/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com