일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MySQL
- Core Java
- JDBC
- Thymeleaf
- Open Source
- MSSQL
- Eclipse
- Exception
- Tomcat
- oracle
- JavaScript
- Python
- error
- IntelliJ
- 오픈소스
- 설정
- PostgreSQL
- Docker
- jpa
- STS
- myBatis
- ubuntu
- git
- 문서
- SpringBoot
- spring
- AJAX
- Spring Boot
- maven
- Source
- Today
- Total
헤르메스 LIFE
[Spring Boot] Jackson 직렬화 문제 본문
개발환경
Spring Boot 2.7.9
H2 2.1.214
p6spy 1.8.1
slf4j 1.7.36
swagger2 2.6.1
lombok
devtools
postgresql
JPA
Request 받기위한 DTO 클래스입니다.
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import octopus.entity.BaseDto;
import octopus.entity.TCodeD;
/**
* <pre>
* DTO : 데이터 전달 목적
* 데이터를 캡슐화한 데이터 전달 객체
* </pre>
*/
@Data
@Builder
@AllArgsConstructor // 모든인자를 가지는객체 생성
@NoArgsConstructor // 인자 없이 객체 생성
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true) // true의 경우 부모 클래스 필드 값들도 동일한지 체크하며, false(기본값)일 경우 자신 클래스의 필드 값만 고려한다.
public class TCodeDDto extends BaseDto {
private static final long serialVersionUID = 1L;
@NotNull
private String pCd;
@NotNull
private String cd;
private String cdNm;
@Size(min = 1, max = 1)
private String useYn;
@Digits(integer = 4, fraction = 0) // 정수 4자리, 소수점 0자리
private Integer sortSeq;
private String rmk;
public static TCodeDDto makeDto(TCodeD code) {
return TCodeDDto.builder().pCd(code.getPCd()).cd(code.getCd()).cdNm(code.getCdNm())
.sortSeq(code.getSortSeq())
.useYn(code.getUseYn())
.rmk(code.getRmk())
.build();
}
public TCodeD toEntity() {
return TCodeD.builder().pCd(pCd).cd(cd).cdNm(cdNm).useYn(useYn).sortSeq(sortSeq)
.rmk(rmk).crtId(getCrtId()).mdfId(getMdfId())
.build();
}
}
여기서 문제는 pCd 변수 입니다.
pcd 로 보여집니다. 문제없이 Mapping은 됩니다. 그래도 정상적으로 보여지기를 바랍니다.
@NotNull
@JsonProperty("pCd") // Json Type으로 보여질 Field명
private String pCd;
@JsonProperty 를 사용하면 지정된 문자열로 표현됩니다.
@JsonProperty는 각 필드를 지정해서 선택적으로 변경할 수 있습니다.
P_CD 필드를 Camel 표기법으로 표시는 pCd 입니다.
@JsonNaming는 전체 필드를 지정할 수 있습니다.
Camel 표기법을 Snake 표기법으로 일괄 변경할 수 있습니다.
// @JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class) // Deprecated
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
아래와 같이 표현됩니다.
{
"cd": "string",
"cd_nm": "string",
"crt_id": "string",
"mdf_id": "string",
"num_opt1": 0,
"num_opt2": 0,
"num_opt3": 0,
"num_opt4": 0,
"num_opt5": 0,
"pCd": "string",
"rmk": "string",
"sort_seq": 0,
"use_yn": "string",
"wd_opt1": "string",
"wd_opt2": "string",
"wd_opt3": "string",
"wd_opt4": "string",
"wd_opt5": "string"
}
TCodeDDto.java
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import octopus.entity.BaseDto;
import octopus.entity.TCodeD;
/**
* <pre>
* DTO : 데이터 전달 목적
* 데이터를 캡슐화한 데이터 전달 객체
* </pre>
*/
@Data
@Builder
@AllArgsConstructor // 모든인자를 가지는객체 생성
@NoArgsConstructor // 인자 없이 객체 생성
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true) // true의 경우 부모 클래스 필드 값들도 동일한지 체크하며, false(기본값)일 경우 자신 클래스의 필드 값만 고려한다.
// @JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class) // Deprecated
// @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class TCodeDDto extends BaseDto {
private static final long serialVersionUID = 1L;
@NotNull
@JsonProperty("pCd") // Json Type으로 보여질 Field명
private String pCd;
@NotNull
private String cd;
private String cdNm;
@Size(min = 1, max = 1)
private String useYn;
@Digits(integer = 4, fraction = 0) // 정수 4자리, 소수점 0자리
private Integer sortSeq;
private String rmk;
public static TCodeDDto makeDto(TCodeD code) {
return TCodeDDto.builder().pCd(code.getPCd()).cd(code.getCd()).cdNm(code.getCdNm())
.sortSeq(code.getSortSeq())
.useYn(code.getUseYn())
.rmk(code.getRmk())
.build();
}
public TCodeD toEntity() {
return TCodeD.builder().pCd(pCd).cd(cd).cdNm(cdNm).useYn(useYn).sortSeq(sortSeq)
.rmk(rmk).crtId(getCrtId()).mdfId(getMdfId())
.build();
}
}
----------------------------------------------------------------------------------------------------------------------------
Entity Class 컬럼의 속성 타입이 자바에서 Primitive Type으로 되어 있으면 null값을 Setting 할 수 없는 문제도 존재합니다.
Primitive Type 이란 boolean, byte, short, int, long, float, double, char 등의 Type을 말합니다.
----------------------------------------------------------------------------------------------------------------------------
https://hermeslog.tistory.com/696
아래의 소스는
private boolean isAdmin;
다음과 같이 보여집니다. is 가 빠져있지요.
아래와 같이 변경하면
private Boolean isAdmin;
정상적으로 보여집니다.
'Spring Boot Framework' 카테고리의 다른 글
[Spring Boot] 게시판 #1 - 개발환경 (0) | 2023.04.14 |
---|---|
[Spring Boot] HandlerMethodArgumentResolver를 이용한 중복 Source 제거 방법 (0) | 2023.04.04 |
[Swagger] API 문서 자동화 설정 (0) | 2023.03.30 |
[JPA] 정렬 Sort (0) | 2023.03.21 |
[JPA] update (Persistence Context) (0) | 2023.03.18 |