org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class com.coblog.api.request.PostCreate]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.coblog.api.request.PostCreate` (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]
문제가 있었던 테스트 코드
@Test
@DisplayName("/posts 요청시 Hello World를 출력한다.")
void test() throws Exception{
// given
PostCreate request = new PostCreate("제목입니다.", "내용입니다.");
ObjectMapper objectMapper = new ObjectMapper(); // 실무에서 많이 쓰임
String json = objectMapper.writeValueAsString(request);
System.out.println(json);
// expected
mockMvc.perform(post("/posts")
.contentType(APPLICATION_JSON)
.content(json)
)
.andExpect(status().isOk())
.andExpect(content().string("{}"))
.andDo(print());
}
- PostCreate 클래스의 인스턴스를 생성하는데 문제가 발생했다
- 구글링 해보니 Jackson 라이브러리가 JSON 문자열을 'PostCreate' 객체로 역직렬화(Deserialize) 하려고 시도했으나 실패한 것이라고 한다.
- Jackson은 JSON을 Java 객체로 변환할 때 기본 생성자를 사용하려고 시도한다고 함
- 결론: PostCreate 클래스에 기본 생성자를 정의해주지 않아서 오류 발생
@ToString
@Setter @Getter
@NoArgsConstructor
public class PostCreate {
@NotBlank(message = "타이틀을 입력하세요.")
private String title;
@NotBlank(message = "콘텐츠를 입력해주세요.")
private String content;
public PostCreate(String title, String content) {
this.title = title;
this.content = content;
}
}
@NoArgsConstructor를 붙여주면서 해결을 함!
'Spring관련 기술 > Spring' 카테고리의 다른 글
JAR, WAR (0) | 2023.12.30 |
---|