서버/SpringBoot
@RequestBody로 지정한 객체에 꼭 기본 생성자가 필요할까? (com.fasterxml.jackson.databind.exc.InvalidDefinitionException)
juhi
2022. 1. 5. 22:44
에러
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에 대한 의존성이 추가된다.
- spring-boot-starter-web → spring-boot-starter-json → jackson-module-parameter-names
주의사항
- 컴파일 옵션에 따라서 다르게 동작한다.
- 프로젝트에서 아래처럼 Build and run using을 Gradle로 지정해줘야지 build.gradle의 컴파일 옵션이 그대로 적용된다.
Build and run using을 IntelliJ IDEA로 지정한 상태면 안된다!!!
반응형