• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

PostCreate 기본 생성자 문제 질문

23.07.17 17:23 작성 23.07.17 17:24 수정 조회수 483

0

질문

PostController 에서 "/posts" 요청 시 PostCreate Dto Binding 관련 질문

Controller @RequestBody의 Dto는 기본생성자와 Getter or Setter 중 하나가 필요한 것으로 알고 있습니다.

[참고 링크]

하지만, 강사님의 코드를 보면,

PostCreate (Dto)에 기본생성자가 없음에도 테스트가 정상적으로 통과하는데 어떻게 그것이 가능한가요?

제가 따로 코드를 작성하여 시도한 경우, 기본 생성자가 없어서 실패하였습니다. (아래 코드 작성)

 

완전히 같은 질문

호돌맨님 답변 → 생성자가 존재하는 경우 생성자를 통해 값이 들어간다.

답변에 대한 질문 → 저는 생성자가 존재하더라도 기본생성자가 없으면, 오류가 발생합니다.. 왜 그런걸까요?

 


 

강사님 코드

  • 기본 생성자가 없음에도 성공

@Setter
@Getter
@ToString
public class PostCreate {

    @NotBlank(message = "타이틀을 입력하세요.")
    private String title;

    @NotBlank(message = "콘텐츠를 입력해주세요.")
    private String content;

    @Builder
    public PostCreate(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

 

질문자 코드 :: 실패 케이스

  • 강사님 코드와 동일하다고 생각합니다


@Getter
@Setter
@ToString
public class CreatePostRequest {

    @NotBlank(message = "타이틀을 입력하세요")
    private String title;

    @NotBlank(message = "글 내용을 입력하세요")
    private String content;

    @Builder
    private CreatePostRequest(String title, String content) {
        this.title = title;
        this.content = content;
    }
}
  • 오류 메세지

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class com.example.blog.dto.request.CreatePostRequest]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.example.blog.dto.request.CreatePostRequest (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]

※ 컨트롤러에 진입도 못하고 오류 발생합니다.

질문자 코드 :: 성공 케이스

  • @NoArgsConstructor 하나 추가


@Getter
@Setter
@ToString
@NoArgsConstructor
public class CreatePostRequest {

    @NotBlank(message = "타이틀을 입력하세요")
    private String title;

    @NotBlank(message = "글 내용을 입력하세요")
    private String content;

    @Builder
    private CreatePostRequest(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

 

 

답변 1

답변을 작성해보세요.

0

안녕하세요. 호돌맨입니다.
질문을 남겨주셔서 감사합니다.

어!? 뭐지 이상하네여?
근데 이거 저도 가끔씩 그러던데
원인을 잡아봐야겠습니다.
제꺼랑 비교해보게 git 소스점 올려주실 수 있나여?

박종훈님의 프로필

박종훈

질문자

2023.07.17

github link

https://github.com/jhp2014/project-blog

 


혹시 이렇게 올리는게 아니라면,

올리는 방법 간단하게 알려주시면 공부해서 그 방법으로 올리겠습니다. : )

 

코드 감사합니다.
pull 받아서 실행 했는데 정상적으로 수행됩니다.
(PostApiControllerTest의 postTest() 메서드로 테스트 했습니다.)

https://beaniejoy.tistory.com/76 요 링크를 한 번 읽어보시고
다시 한 번 시도 해보셔용. 그래도 잘 안되면


https://open.kakao.com/o/snQ6aljd 이쪽 오픈톡을 메세지 부탁드립니다.
zoom 화상채팅 을 통해 종훈님 컴터에 원격으로 접속하여 확인 해보겠습니다.
(혹시 연결이 필요하시면 zoom 설치 필수)

박종훈님의 프로필

박종훈

질문자

2023.07.18

답변 감사합니다! 링크 덕분에 좋은 공부가 되었습니다.

잘 해결되었고, 다른 분들 참고하실 수 있게 문제 원인을 남겨 놓겠습니다 :)

피드백 이후 다시 시도

  • jackson-module-parameter-names 확인 → 다시 시도 → 같은 에러가 발생

원인

  • 질문자 → Build설정 IntelliJ

  • 강사님 → Build설정 Gradle

  • jackson-module-parameter-names 이 IntelliJ로 Build 하는 경우 동작하지 않음

    링크 :: https://bjp5319.tistory.com/53

해결

  • build를 Gradle로 설정하니 jackson-module-parameter-names이 정상 작동 해서 기본 생성자 없이 @ResponseBody 동작하는 것을 확인했습니다!

채널톡 아이콘