SLF4J:对 lombok 类型的对象调用 toString() 失败
SLF4J: Failed toString() invocation on an object of type lombok
我遇到了以下错误。
SLF4J: Failed toString() invocation on an object of type [com.xxxx.entity.Employee]
Reported exception:
java.lang.WhosebugError
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;
}
Department.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;
}
您在 Employee
(通过字段 departments
)和 Department
之间有一个双向引用(我们看不到是哪个字段,因为您省略了那个字段,或者您粘贴的代码有误)。 类 中生成的 toString()
方法无休止地相互调用。
使用 @ToString.Exclude
.
为生成的 toString()
(最好是不太重要的字段)排除这些字段之一
PS:您可能 运行 遇到与 equals
和 hashCode
类似的问题。使用 @EqualsAndHashCode.Exclude
.
也将其排除在外
您可以覆盖 toString 方法而不是 lombok 注释
我遇到了以下错误。
SLF4J: Failed toString() invocation on an object of type [com.xxxx.entity.Employee]
Reported exception:
java.lang.WhosebugError
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;
}
Department.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;
}
您在 Employee
(通过字段 departments
)和 Department
之间有一个双向引用(我们看不到是哪个字段,因为您省略了那个字段,或者您粘贴的代码有误)。 类 中生成的 toString()
方法无休止地相互调用。
使用 @ToString.Exclude
.
toString()
(最好是不太重要的字段)排除这些字段之一
PS:您可能 运行 遇到与 equals
和 hashCode
类似的问题。使用 @EqualsAndHashCode.Exclude
.
您可以覆盖 toString 方法而不是 lombok 注释