Java 使用推土机进行集合映射时的无限循环

Java 使用推土机进行集合映射时的无限循环,java,collections,mapping,infinite-loop,dozer,Java,Collections,Mapping,Infinite Loop,Dozer,我正在开发一个项目,它在前端使用BackboneJS,在后端使用Java-Spring内核。我在将实体(域)对象映射到DTO对象时遇到问题。我收到这样的错误消息: org.apache.cxf.interceptor.Fault:无限递归(StackOverflowerError)(通过引用链:com.countdown.dto.CategoryDTO[“countdownList”]->java.util.ArrayList[0]->com.countdown.dto.CountdownDTO

我正在开发一个项目,它在前端使用BackboneJS,在后端使用Java-Spring内核。我在将实体(域)对象映射到DTO对象时遇到问题。我收到这样的错误消息:

org.apache.cxf.interceptor.Fault:无限递归(StackOverflowerError)(通过引用链:com.countdown.dto.CategoryDTO[“countdownList”]->java.util.ArrayList[0]->com.countdown.dto.CountdownDTO[“category”]->

User.java

@Entity
@Table(name = "Users")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "USER_ID", nullable = false)
    private int id;

    @Column(name = "EMAIL", nullable = false, unique = true)
    private String email;

    @Column(name = "NAME_SURNAME", nullable = false)
    private String nameSurname;

    @Column(name = "PASSWORD", nullable = false)
    private String password;

    @Column(name = "USERNAME", nullable = false, unique = true)
    private String username;

    @Column(name = "REGISTER_DATE", nullable = false)
    private Date registerDate;

    @ManyToOne
    @JoinColumn(name = "ROLE_ID")
    private Role role;

    @OneToMany(mappedBy = "createUser")
    private List<Countdown> createCountdownList = new ArrayList<Countdown>();

    @OneToMany(mappedBy = "updateUser")
    private List<Countdown> updateCountdownList = new ArrayList<Countdown>();

    @ManyToMany
    @JoinTable(name = "FOLLOWINGS",
            joinColumns = @JoinColumn(name = "USER_ID"),
            inverseJoinColumns = @JoinColumn(name = "COUNTDOWN_ID"))
    private List<Countdown> followings = new ArrayList<Countdown>();

    //Getters and setters..

}
@Entity
public class Role implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ROLE_ID")
    private int id;

    @Column(name = "ROLE_NAME", nullable = false)
    private String roleName;

    @OneToMany(mappedBy = "role",fetch = FetchType.LAZY)
    List<User> userList = new ArrayList<User>();
 }
@Entity
@Table(name = "COUNTDOWN")
public class Countdown implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "COUNTDOWN_ID")
    private int id;

    @Column(name = "COUNTDOWN_NAME", nullable = false)
    private String countdownName;

    @Column(name = "COUNTDOWN_DATE", nullable = false)
    private Date countdownDate;

    @Column(columnDefinition = "varchar(5000)")
    private String countdownDescription;

    @JoinColumn(name = "CATEGORY_ID", nullable = false)
    @ManyToOne
    private Category category;

    @JoinColumn(name = "CREATE_USER", nullable = false)
    @ManyToOne
    private User createUser;

    @Column(name = "CREATE_DATE", nullable = false)
    private Date createDate;

    @JoinColumn(name = "UPDATE_USER", nullable = false)
    @ManyToOne
    private User updateUser;

    @Column(name = "UPDATE_DATE", nullable = false)
    private Date updateDate;

    @Column(name = "CREATE_USER_IP", nullable = false)
    private int createIP;

    @ManyToMany
    private List<User> followers = new ArrayList<User>();

}
@Entity
@Table(name="CATEGORY")
public class Category implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="CATEGORY_ID")
    private int id;

    @Column(name = "CATEGORY_NAME" , nullable = false)
    private String categoryName;

    @OneToMany(mappedBy = "category")
    private List<Countdown> countdownList = new ArrayList<Countdown>();

}
@实体
@表(name=“Users”)
公共类用户实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“USER\u ID”,null=false)
私有int-id;
@列(name=“EMAIL”,nullable=false,unique=true)
私人字符串电子邮件;
@列(name=“name\u姓氏”,null=false)
私有字符串名称;
@列(name=“PASSWORD”,null=false)
私有字符串密码;
@列(name=“USERNAME”,nullable=false,unique=true)
私有字符串用户名;
@列(name=“REGISTER\u DATE”,null=false)
私人日期登记日期;
@许多酮
@JoinColumn(name=“ROLE\u ID”)
私人角色;
@OneToMany(mappedBy=“createUser”)
私有列表createCountdownList=新的ArrayList();
@OneToMany(mappedBy=“updateUser”)
私有列表updateCountdownList=新的ArrayList();
@许多
@JoinTable(name=“followers”,
joinColumns=@JoinColumn(name=“USER\u ID”),
inverseJoinColumns=@JoinColumn(name=“COUNTDOWN\u ID”))
以下私有列表=新的ArrayList();
//能手和二传手。。
}
Role.java

@Entity
@Table(name = "Users")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "USER_ID", nullable = false)
    private int id;

    @Column(name = "EMAIL", nullable = false, unique = true)
    private String email;

    @Column(name = "NAME_SURNAME", nullable = false)
    private String nameSurname;

    @Column(name = "PASSWORD", nullable = false)
    private String password;

    @Column(name = "USERNAME", nullable = false, unique = true)
    private String username;

    @Column(name = "REGISTER_DATE", nullable = false)
    private Date registerDate;

    @ManyToOne
    @JoinColumn(name = "ROLE_ID")
    private Role role;

    @OneToMany(mappedBy = "createUser")
    private List<Countdown> createCountdownList = new ArrayList<Countdown>();

    @OneToMany(mappedBy = "updateUser")
    private List<Countdown> updateCountdownList = new ArrayList<Countdown>();

    @ManyToMany
    @JoinTable(name = "FOLLOWINGS",
            joinColumns = @JoinColumn(name = "USER_ID"),
            inverseJoinColumns = @JoinColumn(name = "COUNTDOWN_ID"))
    private List<Countdown> followings = new ArrayList<Countdown>();

    //Getters and setters..

}
@Entity
public class Role implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ROLE_ID")
    private int id;

    @Column(name = "ROLE_NAME", nullable = false)
    private String roleName;

    @OneToMany(mappedBy = "role",fetch = FetchType.LAZY)
    List<User> userList = new ArrayList<User>();
 }
@Entity
@Table(name = "COUNTDOWN")
public class Countdown implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "COUNTDOWN_ID")
    private int id;

    @Column(name = "COUNTDOWN_NAME", nullable = false)
    private String countdownName;

    @Column(name = "COUNTDOWN_DATE", nullable = false)
    private Date countdownDate;

    @Column(columnDefinition = "varchar(5000)")
    private String countdownDescription;

    @JoinColumn(name = "CATEGORY_ID", nullable = false)
    @ManyToOne
    private Category category;

    @JoinColumn(name = "CREATE_USER", nullable = false)
    @ManyToOne
    private User createUser;

    @Column(name = "CREATE_DATE", nullable = false)
    private Date createDate;

    @JoinColumn(name = "UPDATE_USER", nullable = false)
    @ManyToOne
    private User updateUser;

    @Column(name = "UPDATE_DATE", nullable = false)
    private Date updateDate;

    @Column(name = "CREATE_USER_IP", nullable = false)
    private int createIP;

    @ManyToMany
    private List<User> followers = new ArrayList<User>();

}
@Entity
@Table(name="CATEGORY")
public class Category implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="CATEGORY_ID")
    private int id;

    @Column(name = "CATEGORY_NAME" , nullable = false)
    private String categoryName;

    @OneToMany(mappedBy = "category")
    private List<Countdown> countdownList = new ArrayList<Countdown>();

}
@实体
公共类角色实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“ROLE\u ID”)
私有int-id;
@列(name=“ROLE\u name”,nullable=false)
私有字符串roleName;
@OneToMany(mappedBy=“role”,fetch=FetchType.LAZY)
List userList=new ArrayList();
}
Countdown.java

@Entity
@Table(name = "Users")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "USER_ID", nullable = false)
    private int id;

    @Column(name = "EMAIL", nullable = false, unique = true)
    private String email;

    @Column(name = "NAME_SURNAME", nullable = false)
    private String nameSurname;

    @Column(name = "PASSWORD", nullable = false)
    private String password;

    @Column(name = "USERNAME", nullable = false, unique = true)
    private String username;

    @Column(name = "REGISTER_DATE", nullable = false)
    private Date registerDate;

    @ManyToOne
    @JoinColumn(name = "ROLE_ID")
    private Role role;

    @OneToMany(mappedBy = "createUser")
    private List<Countdown> createCountdownList = new ArrayList<Countdown>();

    @OneToMany(mappedBy = "updateUser")
    private List<Countdown> updateCountdownList = new ArrayList<Countdown>();

    @ManyToMany
    @JoinTable(name = "FOLLOWINGS",
            joinColumns = @JoinColumn(name = "USER_ID"),
            inverseJoinColumns = @JoinColumn(name = "COUNTDOWN_ID"))
    private List<Countdown> followings = new ArrayList<Countdown>();

    //Getters and setters..

}
@Entity
public class Role implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ROLE_ID")
    private int id;

    @Column(name = "ROLE_NAME", nullable = false)
    private String roleName;

    @OneToMany(mappedBy = "role",fetch = FetchType.LAZY)
    List<User> userList = new ArrayList<User>();
 }
@Entity
@Table(name = "COUNTDOWN")
public class Countdown implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "COUNTDOWN_ID")
    private int id;

    @Column(name = "COUNTDOWN_NAME", nullable = false)
    private String countdownName;

    @Column(name = "COUNTDOWN_DATE", nullable = false)
    private Date countdownDate;

    @Column(columnDefinition = "varchar(5000)")
    private String countdownDescription;

    @JoinColumn(name = "CATEGORY_ID", nullable = false)
    @ManyToOne
    private Category category;

    @JoinColumn(name = "CREATE_USER", nullable = false)
    @ManyToOne
    private User createUser;

    @Column(name = "CREATE_DATE", nullable = false)
    private Date createDate;

    @JoinColumn(name = "UPDATE_USER", nullable = false)
    @ManyToOne
    private User updateUser;

    @Column(name = "UPDATE_DATE", nullable = false)
    private Date updateDate;

    @Column(name = "CREATE_USER_IP", nullable = false)
    private int createIP;

    @ManyToMany
    private List<User> followers = new ArrayList<User>();

}
@Entity
@Table(name="CATEGORY")
public class Category implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="CATEGORY_ID")
    private int id;

    @Column(name = "CATEGORY_NAME" , nullable = false)
    private String categoryName;

    @OneToMany(mappedBy = "category")
    private List<Countdown> countdownList = new ArrayList<Countdown>();

}
@实体
@表(name=“倒计时”)
公共类倒计时实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“倒计时\u ID”)
私有int-id;
@列(name=“COUNTDOWN\u name”,null=false)
私有字符串倒计时名称;
@列(name=“COUNTDOWN\u DATE”,null=false)
私人日期倒计时;
@列(columnDefinition=“varchar(5000)”)
私有字符串倒计时描述;
@JoinColumn(name=“CATEGORY\u ID”,nullable=false)
@许多酮
私人类别;
@JoinColumn(name=“CREATE\u USER”,nullable=false)
@许多酮
私有用户;
@列(name=“CREATE_DATE”,null=false)
私人日期;
@JoinColumn(name=“UPDATE\u USER”,nullable=false)
@许多酮
私有用户更新器;
@列(name=“UPDATE\u DATE”,null=false)
私人日期更新日期;
@列(name=“CREATE\u USER\u IP”,null=false)
私有IP;
@许多
private List followers=new ArrayList();
}
Category.java

@Entity
@Table(name = "Users")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "USER_ID", nullable = false)
    private int id;

    @Column(name = "EMAIL", nullable = false, unique = true)
    private String email;

    @Column(name = "NAME_SURNAME", nullable = false)
    private String nameSurname;

    @Column(name = "PASSWORD", nullable = false)
    private String password;

    @Column(name = "USERNAME", nullable = false, unique = true)
    private String username;

    @Column(name = "REGISTER_DATE", nullable = false)
    private Date registerDate;

    @ManyToOne
    @JoinColumn(name = "ROLE_ID")
    private Role role;

    @OneToMany(mappedBy = "createUser")
    private List<Countdown> createCountdownList = new ArrayList<Countdown>();

    @OneToMany(mappedBy = "updateUser")
    private List<Countdown> updateCountdownList = new ArrayList<Countdown>();

    @ManyToMany
    @JoinTable(name = "FOLLOWINGS",
            joinColumns = @JoinColumn(name = "USER_ID"),
            inverseJoinColumns = @JoinColumn(name = "COUNTDOWN_ID"))
    private List<Countdown> followings = new ArrayList<Countdown>();

    //Getters and setters..

}
@Entity
public class Role implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ROLE_ID")
    private int id;

    @Column(name = "ROLE_NAME", nullable = false)
    private String roleName;

    @OneToMany(mappedBy = "role",fetch = FetchType.LAZY)
    List<User> userList = new ArrayList<User>();
 }
@Entity
@Table(name = "COUNTDOWN")
public class Countdown implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "COUNTDOWN_ID")
    private int id;

    @Column(name = "COUNTDOWN_NAME", nullable = false)
    private String countdownName;

    @Column(name = "COUNTDOWN_DATE", nullable = false)
    private Date countdownDate;

    @Column(columnDefinition = "varchar(5000)")
    private String countdownDescription;

    @JoinColumn(name = "CATEGORY_ID", nullable = false)
    @ManyToOne
    private Category category;

    @JoinColumn(name = "CREATE_USER", nullable = false)
    @ManyToOne
    private User createUser;

    @Column(name = "CREATE_DATE", nullable = false)
    private Date createDate;

    @JoinColumn(name = "UPDATE_USER", nullable = false)
    @ManyToOne
    private User updateUser;

    @Column(name = "UPDATE_DATE", nullable = false)
    private Date updateDate;

    @Column(name = "CREATE_USER_IP", nullable = false)
    private int createIP;

    @ManyToMany
    private List<User> followers = new ArrayList<User>();

}
@Entity
@Table(name="CATEGORY")
public class Category implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="CATEGORY_ID")
    private int id;

    @Column(name = "CATEGORY_NAME" , nullable = false)
    private String categoryName;

    @OneToMany(mappedBy = "category")
    private List<Countdown> countdownList = new ArrayList<Countdown>();

}
@实体
@表(name=“CATEGORY”)
公共类类别实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“CATEGORY\u ID”)
私有int-id;
@列(name=“CATEGORY\u name”,nullable=false)
私有字符串categoryName;
@OneToMany(mappedBy=“类别”)
private List countdownList=new ArrayList();
}
业务逻辑:CategoryServiceImpl.java 我在forEach循环中遇到错误

@Transactional(readOnly = true)
public List<CategoryDTO> getAllCategories() {
    List<Category> categoryList;
    List<CategoryDTO> categoryDTOList = new ArrayList<CategoryDTO>();

    logger.debug("getAllCategories called");

    try {
        categoryList = categoryDAO.findAll();
        for(Category category : categoryList){
            categoryDTOList.add(mapper.map(category,CategoryDTO.class));
        }
    }catch (NoResultException e){
        logger.error("getAllCategories method : No Category wasn't found");
        logger.warn(e,e);
    }catch (Exception e){
        logger.error("getAllCategories method : Categories wasn't found");
        logger.warn(e,e);
    }
    return categoryDTOList;
}
@Transactional(readOnly=true)
公共列表getAllCategories(){
列表分类列表;
List CategoryToList=新建ArrayList();
debug(“调用getAllCategories”);
试一试{
categoryList=categoryDAO.findAll();
用于(类别:类别列表){
添加(mapper.map(category,CategoryDTO.class));
}
}捕获(noresulte异常){
错误(“getAllCategories方法:未找到任何类别”);
记录器警告(e,e);
}捕获(例外e){
错误(“getAllCategories方法:未找到类别”);
记录器警告(e,e);
}
返回分类列表;
}
我还必须在表示层中使用DTO对象吗?我可以在表示层中使用实体对象而不是DTO对象吗

我如何解决这个问题?对不起,我的英语不好。谢谢!

请尝试:

    @Transactional(readOnly = true)
    public List<CategoryDTO> getAllCategories() {
        List<Category> categoryList;
        List<CategoryDTO> categoryDTOList = new ArrayList<CategoryDTO>();

        logger.debug("getAllCategories called");

        try {
            categoryList = categoryDAO.findAll();

            for(Category category : categoryList){
                  if(category.getCountdownList() != null && !category.getCountdownList().isEmpty()){
                      for(Countdown countdown : category.getCountdownList()){
                          countdown.setCategory(null);
                      }
                   }
                categoryDTOList.add(mapper.map(category,CategoryDTO.class));
            }
        }catch (NoResultException e){
            logger.error("getAllCategories method : Hata: No Category wasn't found");
            logger.warn(e,e);
        }catch (Exception e){
            logger.error("getAllCategories method : Hata: Categories wasn't found");
            logger.warn(e,e);
        }
        return categoryDTOList;
    }
@Transactional(readOnly=true)
公共列表getAllCategories(){
列表分类列表;
List CategoryToList=新建ArrayList();
debug(“调用getAllCategories”);
试一试{
categoryList=categoryDAO.findAll();
用于(类别:类别列表){
if(category.getCountdownList()!=null&&!category.getCountdownList().isEmpty()){
for(倒计时:category.getCountdownList()){
倒计时。设置类别(空);
}
}
添加(mapper.map(category,CategoryDTO.class));
}
}捕获(noresulte异常){
错误(“getAllCategories方法:Hata:未找到任何类别”);
记录器警告(e,e);
}捕获(例外e){
错误(“getAllCategories方法:Hata:未找到类别”);
记录器警告(e,e);
}
返回分类列表;
}

适用于那些在推土机中挣扎于无限递归问题的人

我使用
mapId
定义一个叶对象并停止递归

假设我们有两个实体
课程
教师
,它们包含一个多对多关系,我们希望将