Mapstruct:尝试在嵌入对象内映射字段时返回 null

Mapstruct: Returning null when trying to map a field inside an embedded object

我们接到任务,要使用 Mapstruct 在 Spring 中重新创建 Twitter API 的简单版本。

我们正在 returning List<UserDto> 应该 return 来自嵌入对象 Credentials 的字段 username

我们将其映射如下:

@Mapper(componentModel = "spring", uses = {ProfileMapper.class, CredentialMapper.class})
public interface UserMapper {

    User dtoToEntity(CreateUserDto createUserDto);

    @Mapping(target = "username", source = "credentials.username")
    List<UserDto> entitiesToDtos(List<User> users);

}

我们的UserDto是这样指定的:

@NoArgsConstructor
@Data
public class UserDto {

    private ProfileDto profile;
    private Timestamp joined;
    private String username;

}

我们的 User 实体有一个名为 credentials 的嵌入对象,其中用户的 usernamepassword 以字符串格式存储(我知道这很愚蠢,这只是一个作业)。

@NoArgsConstructor
@Entity
@Data
@Table(name="users")
public class User {

    @Id
    @GeneratedValue
    private Long id;

    @CreationTimestamp
    private Timestamp joined;

    private boolean deleted;

    @Embedded
    private Credential credentials;

    @Embedded
    private Profile profile;

长话短说,当我们获取所有用户时,我们应该收到这个(这些是假的名字和数字):

{
    "profile": {
        "firstName": "Chanda",
        "lastName": "Hackett",
        "email": "chandahackett@gmail.com",
        "phone": "313-574-1401"
    },
    "joined": "2021-03-17T21:15:35.289+00:00",
    "username": "chandahackett"
}

但是,我们收到了用户名的 null 值:

{
    "profile": {
        "firstName": "Chanda",
        "lastName": "Hackett",
        "email": "chandahackett@gmail.com",
        "phone": "313-574-1401"
    },
    "joined": "2021-03-17T21:15:35.289+00:00",
    "username": null
}

我知道 credentials 中的值 username 存在,因为它存在于 table 它被存储:

并且它是可访问的,因为调用 user.getCredentials().getUsername() return 正确用户名的其他方法。

我几乎什么都试过了。我有 运行 mvn clean install,重命名的变量。我没主意了。任何帮助将不胜感激。

目前不支持您尝试在集合映射方法上使用 @Mapping 的方式。您需要声明从 UserUserDto 的显式映射,并在其上应用注释:

@Mapper(componentModel = "spring", uses = {ProfileMapper.class, CredentialMapper.class})
public interface UserMapper {
    User dtoToEntity(CreateUserDto createUserDto);
    @Mapping(target = "username", source = "credentials.username")
    UserDto entityToDto(User user);
    List<UserDto> entitiesToDtos(List<User> users);
}