Java Mapstruct将多个空结果映射到一个空结果
我在一对多和多对一关系的Spring Boot rest api中映射实体时遇到问题 我使用Java Mapstruct将多个空结果映射到一个空结果,java,spring-boot,spring-data-jpa,lombok,mapstruct,Java,Spring Boot,Spring Data Jpa,Lombok,Mapstruct,我在一对多和多对一关系的Spring Boot rest api中映射实体时遇到问题 我使用 mapstruct 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;
mapstruct 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());
Policy.class
@资料
@实体
@表(name=“Policy”)
公共类策略实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@列(name=“Policy\u UID”,nullable=false)
私有整数策略UID;
//没有关系的其他字段
@manytone(fetch=FetchType.EAGER)
@JoinColumn(name=“userID”,referencedColumnName=“Id”)
私人用户;
}
用户类
@资料
@实体
@表(name=“User”)
公共类用户实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@列(name=“Id”)
私有整数id;
//没有关系的其他字段
@OneToMany(mappedBy=“用户”)
@杰索尼奥雷
公开名单政策名单;
}
政策类
@资料
@AllArgsConstructor
@诺尔格构装师
公共类策略{
私有整数策略UID;
//没有关系的其他字段
私人用户对用户;
}
UserDTO.class
@资料
@AllArgsConstructor
@诺尔格构装师
公共类UserDTO{
私有整数id;
//没有关系的其他字段
公开名单政策名单;
}
PolicyMapper.class
@映射器(componentModel=“spring”)
公共接口策略映射器{
PolicyDTO policytoPolicyDTO(Policy Policy);
列出toPolicyListDTO(列出策略);
}
UserMapper.class
@映射器(componentModel=“spring”)
公共接口用户映射器{
UserDTO toUserDTO(用户用户);
List toUserListDTO(List UsersList);
}
以及对结果的呼吁
List List=policyMapper.toPolicyListDTO(paging.getContent());
返回新的PageImpl(列表、页面、paging.getTotalElements());
所以当我发表评论时
私人用户对用户进入策略,并
公共列表策略列表进入UserDTO
结果策略列出所有字段中的值都可以,当然两个字段除外。
如果我用双向关系将这两个字段取消注释到DTO中,结果不仅在关系字段中为空,而且在所有字段中都为空。所有字段都为空,就像根本没有结果一样
因此,问题在于双向一对多和多对一关系映射
除此之外,我必须告诉您,如果有必要,大多数策略都有空UserID
有人对这个问题有什么建议吗
提前感谢您首先尝试使用MapStruct版本
<mapstruct.version>1.3.1.Final</mapstruct.version>
1.3.1.Final
要使用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);
}
公共接口实体映射器{
公共电子实体(D dto);
公共托德机构(实体);
向实体公开名单(名单数据列表);
公共列表toDto(列表实体列表);
}
并创建自己的实体接口
@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;
}
}
@Mapper(componentModel=“spring”,使用={})
公共接口策略映射器扩展EntityMapper{
PolicyDTO toDto(Policy Policy);
保单到实体(保单到保单);
默认策略fromId(长id){
if(id==null){
返回null;
}
策略=新策略();
policy.setId(id);
退货政策;
}
}
@映射器(componentModel=“spring”,使用={})
公共接口UserMapper扩展了EntityMapper{
UserDTO toDto(用户用户);
用户到实体(UserDTO UserDTO);
默认用户fromId(长id){
if(id==null){
返回null;
}
用户=新用户();
user.setId(id);
返回用户;
}
}
你不需要定义一个方法来呈现一个列表,这是MapStruct的一个功能性来映射实体中的所有字段,你只需要ToTo,toEntity,它就可以工作了
我希望这对你有帮助;) @BENMOHAMED我需要的主要是政策实体,即“双直选”中的多对一。我的注释过程路径是
<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>
org.mapstruct
mapstruct处理器
${org.mapstruct.version}
org.projectlombok
龙目
1.18.20
经过大量的研究,它是关于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>
org.projectlombok
龙目
1.18.20
org.projectlombok
lombok映射结构绑定
0.2.0
org.mapstruct
mapstruct处理器
${org.mapstruct.version}
尝试添加示例中的注释。。当源和目标bean字段名相同时,字段之间的映射就会发生。否则,如果它们不同,则需要通过指定源字段和目标字段来添加@Mapping注释。此外,在编译应用程序时,还会生成UserMapperImpl和PolicyMapperImpl类文件。您可以始终在其中设置调试点,也可以查看生成的映射进行验证。@Lucia关于@Mapper(uses={OrderItemMapper.class})的内容感谢您的回答@BENMOHAMED。现在通过您的方法,我得到了一个未找到目标bean属性:无法映射Collec