강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của cjyeon10223358
cjyeon10223358

câu hỏi đã được viết

Triển khai dự án mẫu API dựa trên Spring Boot để cải thiện năng suất

Triển khai phát hành Kakao Token (2) - Nhận Token

Spring Cloud OpenFeign 부터 계속 DTO쪽 에러가 발생하는데 원인을 모르겠습니다.

Viết

·

775

0

안녕하세요. 지난번에 DTO 기본생성자 에러가 발생해서 프로젝트 다시 생성해서 해보고 잘되었는데요.

브라우저에서 로그인해서 카카오토큰 받아오는것에서 또 같은 오류가 발생하더라구요.

public class KakaoTokenDto {

    @Builder @Getter
    public static class Request {
        private String grant_type;
        private String client_id;
        private String redirect_uri;
        private String code;
        private String client_secret;
    }

    @ToString
    @Builder @Getter
    public static class Response {
        private String token_type;
        private String access_token;
        private Integer expires_in;
        private String refresh_token;
        private Integer refresh_token_expires_in;
        private String scope;
    }

}

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.app.web.kakaotoken.dto.KakaoTokenDto$Response (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 2]

 

이번에도 기본생성자 오류문제인데요. 강사님꺼 완성본 코드를

수정해서 실행하면 잘되는데 제꺼 파일 다 지우고 강사님꺼 파일과 코드를

복사 붙여넣기 하면 또 안되고 그렇습니다. 🤔 왜 제껏만 DTO쪽에서

이런 에러가 발생하는지 잘 모르겠습니다.

web-apispring-bootJPA

Câu trả lời 2

1

cjyeon10223358님의 프로필 이미지
cjyeon10223358
Người đặt câu hỏi

안녕하세요. 상세한 설명 감사합니다.

제가 깃허브 공유하려고 실습프로젝트를 옮기기 또 잘되고 그러네요.

우선 깃허브 url 공유하겠습니다. application.yml 에서 카카오 클라이언트 id, secret 이랑 loginForm client_id=

이부분만 삭제했습니다.

bgh79465479님의 프로필 이미지
bgh79465479
Người chia sẻ kiến thức

일단 올려주신 코드로 재현해보려니까 정상적으로 동작을 하고 있어서 정확한 원인 파악이 어렵네요 ㅠ

카카오에서 반환해주는 json 데이터가 이상해서 오류가 날 수도 있고, 롬복 버전이나 스프링 버전에 따라서 다를 수 있다고 합니다.

 

그래서 기준을 드리면 jackson 라이브러리로 직렬화/역직렬화를 할 때는 기본생성자는 항상 넣어주시면 될꺼 같습니다.롬복 어노테이션으로는 @NoArgsConstructor 를 붙여주시면 되시고, @Builder를 사용하면 @AllArgsConstructor @NoArgsConstructor 둘다 넣어주시면됩니다.

 

cjyeon10223358님의 프로필 이미지
cjyeon10223358
Người đặt câu hỏi

아 그렇군요 ㅜ 상세한 설명 감사합니다 !!

1

bgh79465479님의 프로필 이미지
bgh79465479
Người chia sẻ kiến thức

안녕하세요! json 데이터를 java object로 바꾸는 것을 deserialization(역직렬화) 라고 하는데 jackson 라이브러리의 ObjectMapper를 통해서 deserialization 해줍니다. 이 과정중에서 기본 생성자를 이용하여 deserialization을 해주는 것으로 보이네요.

 

@Builder 어노테이션을 붙여둔 경우에는 전체 필드를 갖는 생성자를 만들어주는데, 제가 작성한 코드에서는 정상적으로 deserialization을 해주고 있는 것으로 보이구요. 이 부분은 deserialization 과정을 좀 더 봐봐야할꺼 같아서 원인을 찾게되면 댓글로 남겨두도록 하겠습니다. 일단 해당 오류가 발생할 때 builder 어노테이션을 사용하고 있으시다면 전체 필드에 대한 생성자와 기본 생성자를 생성해주는 @AllArgsConstructor @NoArgsConstructor를 클래스쪽에 선언하고 강의를 진행해주시면 됩니다.

 

제 코드에서는 현재 재현이 되고 있지 않아서 민감한 정보들은 삭제 후 깃허브에 코드 올려서 url 전달 주시면 좀 더 봐보도록하겠습니다.

Hình ảnh hồ sơ của cjyeon10223358
cjyeon10223358

câu hỏi đã được viết

Đặt câu hỏi