헤르메스 LIFE

[Spring Boot] Jackson 직렬화 문제 본문

Spring Boot Framework

[Spring Boot] Jackson 직렬화 문제

헤르메스의날개 2023. 4. 1. 01:17
728x90

개발환경

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

 

[JpaSystemException] Resolved [org.springframework.orm.jpa.JpaSystemException: Null value was assigned to a property

개발환경 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 아래와 같은 오류가 발생했습니다. INFO 23-03-18 11:39:785[http-nio-9090-exec-1] octopus.advice.ExceptionAdvice.dataAccessException

hermeslog.tistory.com


아래의 소스는

private boolean isAdmin;

다음과 같이 보여집니다. is 가 빠져있지요.

아래와 같이 변경하면

private Boolean isAdmin;

정상적으로 보여집니다.

728x90