문제점
java.lang.IllegalArgumentException: Unable to serialize claims object to json: Unable to serialize object: Java 8 date/time type `java.time.LocalDateTime` not supported by default
문제발생코드
@Entity
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Authority extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonIgnore
private Long id;
private String name;
@JoinColumn(name = "roles")
@ManyToOne(fetch = FetchType.LAZY)
@JsonIgnore
private User users;
public void setUser(User user) {
this.users = user;
}
}
- 요번에 리팩토링을 하게 되면서 @MappedSuperclass 매핑 전략을 사용하여
- 등록일자, 수정일자를 기록하게 되면서
- 모든 엔티티에 BaseEntity를 상속해주었습니다.
- 이전에 열심히 작성한 테스트 코드를 돌려보았습니다.
- 아래의 에러가 하나 발생되어서 확인을 해봤습니다.
원인
Java 8 LocalDateTime 직렬화 역직렬화 오류 였습니다.
검색을 빠르게 진행했습니다.
엇! 직렬화는 뭘까? 역직렬화는 뭐지? 찾아보았습니다.
- 직렬화(Serialization) : Java 객체를 JSON으로 변환하는 과정을 직렬화라고 합니다.
- 역직렬화(Deserialization) : JSON을 Java 객체로 변환하는 과정을 역직렬화라고 합니다.
엄청 잘 정리한 분이 있었습니다.
참고 문서
https://woo-chang.tistory.com/75
https://github.com/FasterXML/jackson-databind/issues/2983
해결책
첫번째 방법
- gradle에 이 두가지 의존성을 등록합니다.
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
implementation 'com.fasterxml.jackson.core:jackson-databind'
- @JsonSerialize
- @JsonDeserialize 를 붙여줍니다.
@Getter
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
public abstract class BaseEntity {
@CreatedDate
@Column(nullable = false)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime createdAt;
@LastModifiedDate
@Column(nullable = false)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime updatedAt;
}
두번째방법