当前位置: 首页 > 知识库问答 >
问题:

如何在MapStruct中映射扩展类

赵选
2023-03-14

关于MapStruct的问题。我有这样的情况,我从基实体扩展类,但不知道如何映射它。这是我的箱子。

BaseEntity:

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

基础:

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;
}
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);
}
@Mapper
public interface BaseMapper {

    BaseEntity dtoToEntity(BaseDto baseDto);

    BaseDto entityToDto(BaseEntity baseEntity);
}

没有显示错误,在映射器实现(生成的代码)中没有该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();
    }

共有1个答案

燕博文
2023-03-14

我猜(因为您没有将buider代码)的问题在于您的构建器类不包括父类字段。MapStruct在为Mapper生成代码时做了一些假设。从文件-

BuilderProvider的默认实现假定如下:

  1. 该类型具有返回生成器的无参数公共静态生成器创建方法。例如,Person有一个返回PersonBuilder的公共静态方法。
  2. 构建器类型有一个无参数的公共方法(构建方法),它返回正在构建的类型。在我们的示例中,PersonBuilder有一个方法返回Person。
  3. 如果有多个构建方法,MapStruct将查找一个名为build的方法,如果存在这样的方法,则使用该方法,否则将创建编译错误。
@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();
}
 类似资料:
  • Hi这似乎适用于添加额外的方法,但不适用于在现有方法上添加新的注释。假设我们有以下课程:

  • 当我试图创建一个包含方法的映射器以从同一个源映射到两个类型时,我会得到一个不明确的映射方法错误,即使方法签名(至少返回类型)是不同的。我是不是走错路了?我不能为使用相同源代码的DTO使用子类吗? 编辑:为了方便起见,我使用mapstruct-jdk8:1.1.0.final 编辑2:下面的例子只是一个例子,在我的头顶上。当我实际使用代码时,它起作用了。事实证明,我的问题是示例中没有包含的东西。当我

  • 因此,当我将对象转换为JSON字符串时: dob以以下方式写入JSON字符串: “dob”:{“年份”:1964,“月份”:“二月”,“纪年”:{“日历类型”:“ISO8601”,“ID”:“ISO”},“月份值”:2,“DayofMonth”:13,“DayofWeek”:“星期四”,“Era”:“CE”,“DayofYear”:44,“LeapYear”:true 所以,我不知道我是如何做到这

  • 我最近开始使用mapstruct,在编码时我坚持使用一个场景。为了解决下面默认方法之间的模糊性,我试图在列表中使用“限定由” 但是第1行显示错误,因为需要指定“target”。我不确定这里的目标应该是什么,因为Line是一个集合对象。即使我不使用@mapping,mapstuct也会生成mapper实现。我阅读了mapstuct文档,但对这个场景了解不多。如何在列表上使用命名注释来明确表示这是要使

  • 我在mapstruct映射器上遇到了问题。当运行mvn clean install(或mvn clean compile)时,我会得到以下错误: 问题是我不知道mapstruct从哪里获得这个“java.lang.Integer Architecture.Loads”。我不明白这个整数是从哪里来的,正如您在我的代码中看到的,没有整数。而且,到目前为止,我在使用类似的映射器时从未遇到过这个错误。 下