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
的嵌入对象,其中用户的 username
和 password
以字符串格式存储(我知道这很愚蠢,这只是一个作业)。
@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
的方式。您需要声明从 User
到 UserDto
的显式映射,并在其上应用注释:
@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);
}
我们接到任务,要使用 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
的嵌入对象,其中用户的 username
和 password
以字符串格式存储(我知道这很愚蠢,这只是一个作业)。
@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
的方式。您需要声明从 User
到 UserDto
的显式映射,并在其上应用注释:
@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);
}