-
JSR-303 Errors들을 Json으로 Serialization 해보자Spring/Spring Boot 2020. 6. 25. 02:22
- JSR-303 bean validation이 끝나게 되면 Errors에 error들이 담기게 된다.
- 기본적인 도메인들은 자바 빈 스펙을 따르기 때문에
- BeanSerializer에 의해서 Serialization/Deserialization 이 가능하다. ( 스프링의 경우 ObjectMapper 이용 )
- 하지만 Errors들은 불가능하다.
다음의 예를 봐보자.
- 해당 Person에 name과 age가 담기지 않았다면 errors가 담기게 될 것이다.
- 해당 errors들을 클라이언트들을 위해 Json 형태로 담고 싶다면
- @JsonComponent와 JsonSerializer에 serialize 메서드를 오버 라이딩해서 구현 가능하다.
- 그렇다면 우선 person에 name과 age를 입력하지 않고 보내서
- errors에 담게 하고 해당 모습을 디버깅해서 살펴보자.
- 그리고 이 담긴 모습을 참고해서 ErrorsSerializaer을 만들어보자.
12345678910111213141516171819202122232425262728293031323334353637@JsonComponentpublic class ErrorsSerializer extends JsonSerializer<Errors> {@Overridepublic void serialize(Errors errors, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {jsonGenerator.writeStartArray();errors.getFieldErrors().stream().forEach(e -> {try {jsonGenerator.writeStartObject();jsonGenerator.writeStringField("field", e.getField());jsonGenerator.writeStringField("objectName", e.getObjectName());jsonGenerator.writeStringField("code", e.getCode());jsonGenerator.writeStringField("defaultMessage", e.getDefaultMessage());Object rejectedValue = e.getRejectedValue();if(rejectedValue != null) {jsonGenerator.writeStringField("rejectedValue", rejectedValue.toString());}jsonGenerator.writeEndObject();} catch(IOException e1) {e1.printStackTrace();}});errors.getGlobalErrors().stream().forEach(e -> {try {jsonGenerator.writeStartObject();jsonGenerator.writeStringField("objectName", e.getObjectName());jsonGenerator.writeStringField("code", e.getCode());jsonGenerator.writeStringField("defaultMessage", e.getDefaultMessage());jsonGenerator.writeEndObject();} catch(IOException e1) {e1.printStackTrace();}});jsonGenerator.writeEndArray();}}cs - 다음과 같이 JsonSerializer에 serialize 메서드를 오버 라이딩 해주자.
- 차례로 필드 에러(rejectedValue)를 담고 전역 에러(rejected)를 담을 수 있다.
- 에러가 여러 개 일 수 있으니 writeArray 배열로 감싸주었다.
- 마지막으로 ObjectMapper에 등록은 스프링 부트가 제공하는 @JsonComponent를 통해 간단히 해결 가능하다.
자세한 내용 참조 : https://www.baeldung.com/spring-boot-jsoncomponent
- 다음에 Test는 age와 name에 @NotEmpty가 있지만 넣지 않았고 errors에 담기게 된다.
- errors는 Json 형태로 다시 담기게 되고 따라서 리턴 값에는
- BadRequest 응답, errors에 필드인 objectName 등이 들어있게 된다.
'Spring > Spring Boot' 카테고리의 다른 글
Spring Boot mockMvc 한글 깨짐 처리 (0) 2020.07.31 RestTemplate, WebClient (0) 2020.07.13 스프링 부트 MySQL8 연동 Intellij (0) 2020.06.23 application.properties 등의 외부 설정 (0) 2020.06.13 내장 서블릿 컨테이너 응용 해보기 (0) 2020.05.14