Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mapstruct将多个空结果映射到一个空结果_Java_Spring Boot_Spring Data Jpa_Lombok_Mapstruct - Fatal编程技术网

Java Mapstruct将多个空结果映射到一个空结果

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;

我在一对多和多对一关系的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;

    @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