【问题标题】:SLF4J: Failed toString() invocation on an object of type lombokSLF4J:对 lombok 类型的对象的 toString() 调用失败
【发布时间】:2019-08-03 16:43:42
【问题描述】:

我遇到了错误。

SLF4J: Failed toString() invocation on an object of type [com.xxxx.entity.Employee]
Reported exception:
java.lang.StackOverflowError
    at java.time.temporal.ValueRange.isValidIntValue(ValueRange.java:295)
    at java.time.temporal.ValueRange.checkValidIntValue(ValueRange.java:329)
    at java.time.temporal.ChronoField.checkValidIntValue(ChronoField.java:722)
    at java.time.LocalDate.ofEpochDay(LocalDate.java:341)
    at java.time.LocalDateTime.ofEpochSecond(LocalDateTime.java:422)
    at java.time.format.DateTimeFormatterBuilder$InstantPrinterParser.format(DateTimeFormatterBuilder.java:3194)
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179)
    at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1746)
    at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720)
    at java.time.Instant.toString(Instant.java:1330)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.xxxx.entity.AuditEnabledEntity.toString(AuditEnabledEntity.java:25)
    at com.xxxx.entity.Department.toString(Department.java:38)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.xxxx.entity.Employee.toString(Employee.java:30)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.xxxx.entity.Department.toString(Department.java:38)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.xxxx.entity.Employee.toString(Employee.java:30)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.xxxx.entity.Department.toString(Department.java:38)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.xxxx.entity.Employee.toString(Employee.java:30)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.xxxx.entity.Department.toString(Department.java:38)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.xxxx.entity.Employee.toString(Employee.java:30)

AuditEnabledEntity.java

@Data
@NoArgsConstructor
@AllArgsConstructor
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class AuditEnabledEntity {
    @CreatedDate
    @Column(name = "createdDate", nullable = false, updatable = false)
    private Instant createdDate;

    @LastModifiedDate
    @Column(name = "lastUpdateDate", nullable = false)
    private Instant lastUpdateDate;

    @Column(name = "createUser", nullable = false, length = IConst.USER_LENGTH)
    private String createUser;

    @Column(lastUpdateUser)
    private String lastUpdateUser;
}

Employee.java

@Data
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Employee extends AuditEnabledEntity{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "emp_id")
    private Integer id;

    .......
    .......
    .......

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "program_member_program", 
            joinColumns = { @JoinColumn(name = "emp_id", nullable = false, updatable = false}, 
            inverseJoinColumns = { @JoinColumn(name = "dept_id", nullable = false, updatable = false})
    @JsonIgnore
    private List<Department> departments;

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "programMembers", cascade = CascadeType.ALL)
    @JsonIgnore
    private List<Role> roles;
}

部门.java

@Data
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper=true, includeFieldNames=true)
@NoArgsConstructor
@Entity
@Table(uniqueConstraints = {
        @UniqueConstraint(name="department_name_key",columnNames = {"department_name"})
})
public class Department extends AuditEnabledEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "department_id")
    private Long departmentId;

    ....
    ....
    ....
    ....

    // bi-directional
    @ManyToMany(fetch = FetchType.LAZY, mappedBy="employees", cascade = CascadeType.ALL)
    @JsonIgnore
    private List<Department> departments;
}

【问题讨论】:

标签: spring spring-boot lombok


【解决方案1】:

您在Employee(通过字段departments)和Department 之间有一个双向引用(我们看不到哪个字段,因为您省略了该字段,或者您粘贴的代码错误)。在这些类中生成的toString() 方法都无休止地相互调用。

使用@ToString.Exclude 为生成的toString()(最好是不太重要的字段)排除这些字段之一。

PS:equalshashCode 可能会遇到类似的问题。也可以使用@EqualsAndHashCode.Exclude 将其排除在外。

【讨论】:

  • 我不能简单地省略 EmployeeDepartment 之间的引用。此外,在处理集合时删除 Equals &amp; Hashcode 并不是一个好习惯。你能显示一些代码来解决这个问题吗?
  • 你不应该省略其中一个字段,你应该跳过它来获取 Lombok 生成的 toString()
【解决方案2】:

您可以覆盖 toString 方法而不是 lombok 注释

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多