org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Can not start an array, expecting field name (context: Object)

문법식·2022년 10월 27일
0

Spring Rest API 만드는 강의를 들으면서 실습하고 있는데 테스트가 계속해서 실패했다. 나는 Status 400을 기대하고 테스트했지만, 응답은 계속 Status 500이었다. Status 500이므로 내가 작성한 스프링 코드에 문제가 있는 것이었다. 스프링 부트 프로젝트를 직접 실행해서 테스트하려 했던 요청을 보냈더니 글 아래에 첨부한 예외가 발생했다.

예외 메시지 그대로 Jackson을 쓰고 있는 곳에서 배열로 시작하는 것을 허용하지 않는다는 의미였다. ErrorsSerializer 클래스에서 Jackson을 쓰고 있었고 배열로 JSON을 쓰기 시작하고 있었다. 예외의 원인을 정확하게 파악한 것인지 확인하기 위해 강의 커뮤니티에 검색해보니 백기선 님께서 해당 예외에 대한 해결 방법을 답변해주신 게 있었다.

  • 답변 링크
    https://www.inflearn.com/questions/72123
    스프링 부트 2.3으로 올라가면서 Jackson 라이브러리가 더 이상 Array부터 만드는 것을 허용하지 않는 것이 정확한 예외의 원인이었다.

해결 방법은 아래 첨부한 코드처럼 Jackson을 쓰고 있는 ErrorsSerializer 클래스에서 jsonGenerator.writeStartArray() 코드 위에 jsonGenrator.writeFieldName("errors") 코드를 추가하면 된다.

jsonGenerator.writeFieldName("errors");
jsonGenerator.writeStartArray();

그 후 테스트 코드에서 json에 접근할 때 errors로 접근하도록 코드를 변경하면 된다.

2022-10-27 10:11:21.970  WARN 18856 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Can not start an array, expecting field name (context: Object); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not start an array, expecting field name (context: Object) (through reference chain: com.example.demoinflearnrestapi.common.ErrorsResource["content"])]
profile
백엔드

0개의 댓글