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>