Mapstruct 映射多对一空结果
Mapstruct Mapping Many-to-One null result
我在使用 Mapstruct 将我的实体映射到具有一对多和多对一关系的 Spring-引导休息 api 时遇到问题。
我用
映射结构 1.4.2.Final,
龙目岛 1.18.20
下面有类
Policy.class
@Data
@Entity
@Table(name = "Policy")
public class Policy implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "Policy_UID", nullable = false)
private Integer policyUid;
//other fields without relationships
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "userID", referencedColumnName = "Id")
private User user;
}
User.class
@Data
@Entity
@Table(name = "User")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "Id")
private Integer id;
//other fields without relationships
@OneToMany(mappedBy = "user")
@JsonIgnore
public List<Policy> policyList;
}
PolicyDTO.class
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PolicyDTO {
private Integer policyUid;
//other fields without relationships
private UserDTO user;
}
UserDTO.class
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDTO {
private Integer id;
//other fields without relationships
public List<PolicyDTO> policyList;
}
PolicyMapper.class
@Mapper (componentModel = "spring")
public interface PolicyMapper {
PolicyDTO policytoPolicyDTO(Policy policy);
List<PolicyDTO> toPolicyListDTO(List<Policy> policies);
}
UserMapper.class
@Mapper(componentModel = "spring")
public interface UserMapper {
UserDTO toUserDTO(User user);
List<UserDTO> toUserListDTO(List<User> UsersList);
}
and the calling for results
List<PolicyDTO> list = policyMapper.toPolicyListDTO(paging.getContent());
return new PageImpl<>(list, page, paging.getTotalElements());
所以当我发表评论时
private UserDTO 用户; 到 PolicyDTO 和
public 列出 policyList; 到 UserDTO
结果策略列出了所有字段中的值都可以,当然除了两个注释。
如果我将两个字段取消注释为具有双向关系的 DTO,则结果不仅在关系字段中而且在所有字段中都为空。所有字段都为空,就像没有任何结果一样。
所以问题出在双向一对多和多对一关系映射上。
除此之外,我必须向您说明,如果重要的话,大多数策略的 UserID 都是空的。
有人对这个问题有什么建议吗?
提前致谢
首先尝试使用MapStruct版本
<mapstruct.version>1.3.1.Final</mapstruct.version>
要使用 spring 实现 MapStruct,您应该创建一个带有两个通用参数 的接口 EntityMapper 并在下面编写此方法:
public interface EntityMapper <D, E> {
public E toEntity(D dto);
public D toDto(E entity);
public List<E> toEntity(List<D> dtoList);
public List <D> toDto(List<E> entityList);
}
并创建您自己的实体界面
@Mapper(componentModel = "spring", uses = {})
public interface PolicyMapper extends EntityMapper<PolicyDTO, Policy> {
PolicyDTO toDto(Policy policy);
Policy toEntity(PolicyDTO policyDTO);
default Policy fromId(Long id) {
if (id == null) {
return null;
}
Policy policy = new Policy();
policy.setId(id);
return policy;
}
}
@Mapper(componentModel = "spring", uses = {})
public interface UserMapper extends EntityMapper<UserDTO, User> {
UserDTO toDto(User user);
User toEntity(UserDTO userDTO);
default User fromId(Long id) {
if (id == null) {
return null;
}
User user = new User();
user.setId(id);
return user;
}
}
您不需要定义一个方法来呈现一个列表,这是 MapStruct 映射实体中所有字段的功能,您只需要 toDto、toEntity,它就可以工作。
希望对您有所帮助 ;)
@BENMOHAMED 我主要需要双向的多对一策略实体。我的 annotationProccessorPath 是
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
经过大量研究,它是关于 pom.xml 中 annotationProcessorPaths 设置的优先级
我先设置了 lombok 路径,然后设置了 mapstruct 路径,问题就解决了。
正确设置:
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
我在使用 Mapstruct 将我的实体映射到具有一对多和多对一关系的 Spring-引导休息 api 时遇到问题。
我用
映射结构 1.4.2.Final,
龙目岛 1.18.20
下面有类
Policy.class
@Data
@Entity
@Table(name = "Policy")
public class Policy implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "Policy_UID", nullable = false)
private Integer policyUid;
//other fields without relationships
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "userID", referencedColumnName = "Id")
private User user;
}
User.class
@Data
@Entity
@Table(name = "User")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "Id")
private Integer id;
//other fields without relationships
@OneToMany(mappedBy = "user")
@JsonIgnore
public List<Policy> policyList;
}
PolicyDTO.class
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PolicyDTO {
private Integer policyUid;
//other fields without relationships
private UserDTO user;
}
UserDTO.class
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDTO {
private Integer id;
//other fields without relationships
public List<PolicyDTO> policyList;
}
PolicyMapper.class
@Mapper (componentModel = "spring")
public interface PolicyMapper {
PolicyDTO policytoPolicyDTO(Policy policy);
List<PolicyDTO> toPolicyListDTO(List<Policy> policies);
}
UserMapper.class
@Mapper(componentModel = "spring")
public interface UserMapper {
UserDTO toUserDTO(User user);
List<UserDTO> toUserListDTO(List<User> UsersList);
}
and the calling for results
List<PolicyDTO> list = policyMapper.toPolicyListDTO(paging.getContent());
return new PageImpl<>(list, page, paging.getTotalElements());
所以当我发表评论时 private UserDTO 用户; 到 PolicyDTO 和 public 列出 policyList; 到 UserDTO
结果策略列出了所有字段中的值都可以,当然除了两个注释。 如果我将两个字段取消注释为具有双向关系的 DTO,则结果不仅在关系字段中而且在所有字段中都为空。所有字段都为空,就像没有任何结果一样。
所以问题出在双向一对多和多对一关系映射上。
除此之外,我必须向您说明,如果重要的话,大多数策略的 UserID 都是空的。
有人对这个问题有什么建议吗?
提前致谢
首先尝试使用MapStruct版本
<mapstruct.version>1.3.1.Final</mapstruct.version>
要使用 spring 实现 MapStruct,您应该创建一个带有两个通用参数
public interface EntityMapper <D, E> {
public E toEntity(D dto);
public D toDto(E entity);
public List<E> toEntity(List<D> dtoList);
public List <D> toDto(List<E> entityList);
}
并创建您自己的实体界面
@Mapper(componentModel = "spring", uses = {})
public interface PolicyMapper extends EntityMapper<PolicyDTO, Policy> {
PolicyDTO toDto(Policy policy);
Policy toEntity(PolicyDTO policyDTO);
default Policy fromId(Long id) {
if (id == null) {
return null;
}
Policy policy = new Policy();
policy.setId(id);
return policy;
}
}
@Mapper(componentModel = "spring", uses = {})
public interface UserMapper extends EntityMapper<UserDTO, User> {
UserDTO toDto(User user);
User toEntity(UserDTO userDTO);
default User fromId(Long id) {
if (id == null) {
return null;
}
User user = new User();
user.setId(id);
return user;
}
}
您不需要定义一个方法来呈现一个列表,这是 MapStruct 映射实体中所有字段的功能,您只需要 toDto、toEntity,它就可以工作。
希望对您有所帮助 ;)
@BENMOHAMED 我主要需要双向的多对一策略实体。我的 annotationProccessorPath 是
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
经过大量研究,它是关于 pom.xml 中 annotationProcessorPaths 设置的优先级 我先设置了 lombok 路径,然后设置了 mapstruct 路径,问题就解决了。 正确设置:
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>