Я пытаюсь распечатать объект, который я получаю из базы данных, но каждый раз он выдает мне StackOverFlowError:
SLF4J: Failed toString() invocation on an object of type [java.util.ArrayList]
Reported exception:
java.lang.StackOverflowError
at java.base/java.lang.StringBuilder.<init>(StringBuilder.java:102)
at com.example.NetflixProve.model.Tracker.toString(Tracker.java:116)
at java.base/java.lang.String.valueOf(String.java:4215)
at java.base/java.lang.StringBuilder.append(StringBuilder.java:169)
at com.example.NetflixProve.model.Channel.toString(Channel.java:33)
at java.base/java.lang.String.valueOf(String.java:4215)
at java.base/java.lang.StringBuilder.append(StringBuilder.java:169)
at java.base/java.util.AbstractCollection.toString(AbstractCollection.java:457)
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:622)
at java.base/java.lang.String.valueOf(String.java:4215)
....
то же самое, даже если я использую System.out.println();
Я удалил @Data и добавил @JsonBackedReference, но это не сработало. Мой код в сущностях:
@Entity
@Table(name= "TBL_CHANNEL")
@Getter
@Setter
public class Channel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Generated(GenerationTime.ALWAYS)
private Long id;
@ManyToOne
@JoinColumn(name = "channels")
@JsonBackReference
private Tracker tracker;
@Column(name = "Channel_Name")
private String channelName;
@Override
public String toString() {
return "Channel{" +
"id = " + id +
", tracker = " + tracker +
", channelName='" + channelName + '\'' +
'}';
}
}
и:
@Entity
@Table(name = "TBL_TRACKER")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Tracker {
@Id
@Column(name = "ARCHIVE_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Generated(GenerationTime.ALWAYS)
private Long archiveId;
@Column(name = "NOTIFICATION_ID")
private String notificationId;
@Column(name = "NOTIFICATION_ID_INDEX")
private String notificationIdIndex;
@Column(name = "DELIVERY_CHANNEL")
@Enumerated(EnumType.STRING)
private DeliveryChannel deliveryChannel;
@Column(name = "SENDING_DATE")
@DateTimeFormat
private Date sendingDate;
@Column(name = "SERVICE_ID")
private String serviceId;
@Column(name = "IDENTIFIER_TYPE")
@Enumerated(EnumType.STRING)
private IdentifierType identifierType;
@Column(name = "IDENTIFIER")
private String identifier;//fiscalCode
@Column(name = "PAN")
private String pan;
@Column(name = "FLAG")
@Enumerated(EnumType.STRING)
private FlagEnum flag;
@Column(name = "NOTIFICATION_CATEGORY")
@Enumerated(EnumType.STRING)
private NotificationCategory notificationCategory;
@Column(name = "EXPIRING_DATE")
@DateTimeFormat
private Date expiringDate;
@Column(name = "CREATION_DATE")
@DateTimeFormat
@CreationTimestamp
private Date creationDate;
@Column(name = "VISUALIZATION_DATE")
@DateTimeFormat
private Date visualizationDate;
@Column(name = "EXPIRE_VISUALIZATION_DATE")
@DateTimeFormat
private Date expireVisualizationDate;
@Column(name = "portal")
private PortalEnum portalEnum;
@Column(name = "campaign_name")
private String campaignName;
@Column(name = "business_priority")
private int businessPriority;
@OneToMany(cascade = {CascadeType.ALL},mappedBy = "tracker")
@JsonManagedReference
private List<Channel> channelsId;
@Override
public String toString() {
return "Tracker{" +
"archiveId = " + archiveId +
", notificationId='" + notificationId + '\'' +
", notificationIdIndex='" + notificationIdIndex + '\'' +
", deliveryChannel = " + deliveryChannel +
", sendingDate = " + sendingDate +
", serviceId='" + serviceId + '\'' +
", identifierType = " + identifierType +
", identifier='" + identifier + '\'' +
", pan='" + pan + '\'' +
", flag = " + flag +
", notificationCategory = " + notificationCategory +
", expiringDate = " + expiringDate +
", creationDate = " + creationDate +
", visualizationDate = " + visualizationDate +
", expireVisualizationDate = " + expireVisualizationDate +
", portalEnum = " + portalEnum +
", campaignName='" + campaignName + '\'' +
", businessPriority = " + businessPriority +
", channelsId = " + channelsId +
'}';
}
Ошибка возникает здесь, когда я пытаюсь получить код (позже я буду использовать DTO для печати)
public List<Tracker> findAll(){
List<Tracker> trackerList= trackerRepo.findAll();
log.info("tracker: {}",trackerList);
return trackerList;
}
Вы можете использовать @Data, просто добавьте @ToString.Exclude в трекер-член Channel. Дело в том, чтобы не было круговых путей при вызове toString.