본문 바로가기

서버/SpringBoot

@RequestBody로 지정한 객체에 꼭 기본 생성자가 필요할까? (com.fasterxml.jackson.databind.exc.InvalidDefinitionException)

에러

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 
Cannot construct instance of `객체!` 
(no Creators, like default construct, exist): cannot deserialize from Object value 
(no delegate- or property-based Creator)

에러 메세지를 읽어보면 requestBody로 전달되는 객체에 기본 생성자가 없어서 에러가 난다는 뜻이다.

request로 전달되는 객체의 기본 생성자 

  • 아래처럼 requestBody로 전달되는 객체는 아무 파라미터를 넣지 않아도 생성되는 기본 생성자가 필요하다.
    • @PostMapping("/page/data")
      public ModelAndView downloadPageData(@RequestBody PageFileData pageFileData, Model model) {
        model.addAttribute(CubeDataView.KEY_DATA, pageFileData);
        return new ModelAndView("xlsxView", model.asMap());
      }
  • @requestBody에 기본 생성자가 필요한 이유
  • 기본 생성자가 없다면, 에러가 발생한다. 

기본 생성자를 사용하지 않고 해결하는 방법

  • build.gradle에 jackson-module-parameter-names 의존성을 추가해주면 된다.
    • implementation 'com.fasterxml.jackson.module:jackson-module-parameter-names:2.10.3'
  • spring boot를 사용할 때 spring-boot-starter-web에서 이미 jackson-module-parameter-names에 대한 의존성이 추가된다.

주의사항

  • 컴파일 옵션에 따라서 다르게 동작한다.
  • 프로젝트에서 아래처럼 Build and run using을 Gradle로 지정해줘야지 build.gradle의 컴파일 옵션이 그대로 적용된다. 
  • Build and run using을 IntelliJ IDEA로 지정한 상태면 안된다!!!

  

반응형