0%

jpa LocalDateTime 의 json format 처리

아무런 가공이 없는 LocalDateTime 의 응답 포맷은 배열이 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[
{
"id": 4,
"title": "hello",
"dateCreated": [
2019,
3,
12,
23,
11,
26
],
"dateUpdated": [
2019,
3,
12,
23,
11,
26
]
}
]

따라서 포맷처리를 하려면 아래와 같이 하시면 됩니다.

의존성 추가

1
compile 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'

@JsonFormat 어노테이션 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.todo.api.domain;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import java.time.LocalDateTime;

@Data
@Entity
public class Todo {
@Id @GeneratedValue
private Long id;

@Lob
@Column(nullable = false)
private String title;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
@CreationTimestamp
private LocalDateTime dateCreated;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
@UpdateTimestamp
private LocalDateTime dateUpdated;

public Todo() {
}

public Todo(String title) {
this.title = title;
}
}

포맷처리에 맞는 응답을 확인할 수 있습니다.

1
2
3
4
5
6
7
8
[
{
"id": 4,
"title": "hello",
"dateCreated": "2019-03-12 23:11:26",
"dateUpdated": "2019-03-12 23:11:26"
}
]

첨언

도메인 작성시 날짜를 저장하는 필드의 타입을 LocalDateTime 으로 할 경우 @Temporal 어노테이션을 사용할 수 없습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.todo.api.domain;

import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import java.time.LocalDateTime;

@Data
@Entity
public class Todo {
@Id @GeneratedValue
private Long id;

@Lob
@Column(nullable = false)
private String title;

@Temporal(TemporalType.TIMESTAMP)
@CreationTimestamp
private LocalDateTime dateCreated;

@Temporal(TemporalType.TIMESTAMP)
@UpdateTimestamp
private LocalDateTime dateUpdated;

public Todo() {
}

public Todo(String title) {
this.title = title;
}
}

@Temporal 어노테이션은 Date 또는 Calendar 에만 허용되기 때문입니다.

Caused by: org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar property: com.todo.api.domain.Todo.dateCreated