프로그래밍/ErrorLog

Inner Class Json parse(can only instantiate non-static inner class by using default no-argument constructor)

미냐님 2022. 11. 28. 18:01
728x90

API 요청 후 Json 응답 데이터를 객체로 매핑하는 과정에서 발생하 에러.

 

아래와 같은 객체로 매핑을 하려했지만 에러 발생..

 

원인은 바로 Inner Class가 static(정적)으로 선언되지 않는 한 단독(Outer 클래스를 참조하지 않고)으로 Inner Class의 디폴트 생성자를 호출해 인스턴스를 생성할 수 없는 것이다. 즉, 위와 같은 예외를 피하려면 Inner Class를 별도의 클래스로 생성하던가, 아니면 static Inner Class로 선언해주어야 한다.

 

[ 수정전 ]

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;

@Data
public class ApiResponseDto {

    private String id;
    private List<Generation> generations;
    private Usage usage;

    @Data
    class Generation{
        private String text;                // 생성한 결과
        private Integer tokens;             // 결과 토큰 수
    }

    @Data
    class Usage{
        @JsonProperty("prompt_tokens")
        private Integer promptTokens;       // 프롬프트의 토큰 수
        @JsonProperty("generated_tokens")
        private Integer generatedTokens;    // 생성한 결과의 토큰 수 tokens x n
        @JsonProperty("total_tokens")
        private Integer totalTokens;        // 	prompt_tokens x n + generated_tokens
    }
}

 

 

[ 수정후 ]

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;

@Data
public class ApiResponseDto {

    private String id;
    private List<Generation> generations;
    private Usage usage;

    @Data
    static class Generation{
        private String text;                // 생성한 결과
        private Integer tokens;             // 결과 토큰 수
    }

    @Data
    static class Usage{
        @JsonProperty("prompt_tokens")
        private Integer promptTokens;       // 프롬프트의 토큰 수
        @JsonProperty("generated_tokens")
        private Integer generatedTokens;    // 생성한 결과의 토큰 수 tokens x n
        @JsonProperty("total_tokens")
        private Integer totalTokens;        // 	prompt_tokens x n + generated_tokens
    }
}

 

728x90