Spring Rest API
만드는 강의를 들으면서 실습하고 있는데 테스트가 계속해서 실패했다. 나는 Status
400을 기대하고 테스트했지만, 응답은 계속 Status
500이었다. Status
500이므로 내가 작성한 스프링 코드에 문제가 있는 것이었다. 스프링 부트 프로젝트를 직접 실행해서 테스트하려 했던 요청을 보냈더니 글 아래에 첨부한 예외가 발생했다.
예외 메시지 그대로 Jackson
을 쓰고 있는 곳에서 배열로 시작하는 것을 허용하지 않는다는 의미였다. ErrorsSerializer
클래스에서 Jackson
을 쓰고 있었고 배열로 JSON
을 쓰기 시작하고 있었다. 예외의 원인을 정확하게 파악한 것인지 확인하기 위해 강의 커뮤니티에 검색해보니 백기선 님께서 해당 예외에 대한 해결 방법을 답변해주신 게 있었다.
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"])]