커스텀 메세지 컨버터 만들기
개요
메세지 컨버터를 통해 특정한 요청과 응답에 전용 메세지 컨버터를 적용시킴
WelcomeRequest를 사용하는 요청에 날자 데이터 추가
WelcomeResponse에 Welcome
메세지 추가
Request WelcomeRequest
를 커스텀하게 변환시킬려면 전용 메세지 컨버터가 있어야 한다. 그렇기 때문에 WelcomeRequest
를 전용으로 하는 WelcomeRequestMessageConverter
를 만들면 된다. 좀 더 다양하게 사용할 수 있다는 부분을 보여주기 위해 Content-Type
또한 커스텀하게 적용시켰다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public class WelcomeRequestMessageConverter extends AbstractHttpMessageConverter <WelcomeRequest> { private static final MediaType WELCOME_REQUEST = new MediaType ("welcome" , "request" ); public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; public WelcomeRequestMessageConverter () { super (DEFAULT_CHARSET, WELCOME_REQUEST); } @Override protected boolean supports (Class<?> clazz) { return clazz == WelcomeRequest.class; } @Override protected WelcomeRequest readInternal (Class<? extends WelcomeRequest> clazz, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException { String name = StreamUtils.copyToString(httpInputMessage.getBody(), DEFAULT_CHARSET); return WelcomeRequest.builder().name(name).requestDate(new Date ()).build(); } @Override protected void writeInternal (WelcomeRequest welcomeRequest, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException { return ; } }
Response WelcomeResponse
의 결과에 Welcome
메세지를 추가하기 위해서는 여러 방법이 있겠지만 본 글에서는 메세지 컨버터를 이용한 방법을 소개한다. 본문에 실을 값이 Object
이기에 ObjectMapper로 변환을 해 주어야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 public class WelcomeResponseMessageConverter extends AbstractHttpMessageConverter <WelcomeResponse> { private static final MediaType WELCOME_RESPONSE = new MediaType ("welcome" , "response" ); private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper (); public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; public WelcomeResponseMessageConverter () { super (DEFAULT_CHARSET, WELCOME_RESPONSE); } @Override protected boolean supports (Class<?> clazz) { return clazz == WelcomeResponse.class; } @Override protected WelcomeResponse readInternal (Class<? extends WelcomeResponse> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException { return null ; } @Override protected void writeInternal (WelcomeResponse welcomeResponse, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException { OutputStream outputStream = StreamUtils.nonClosing(httpOutputMessage.getBody()); try { JsonGenerator generator = OBJECT_MAPPER.getFactory().createGenerator(outputStream, JsonEncoding.UTF8); Throwable var10 = null ; try { WelcomeResponse value = WelcomeResponse.builder().welcomeMessage("Welcome " + welcomeResponse.getWelcomeMessage()).build(); ObjectWriter objectWriter = OBJECT_MAPPER.writer(); objectWriter.writeValue(generator, value); generator.flush(); } catch (Throwable var26) { var10 = var26; throw var26; } finally { if (generator != null ) { if (var10 != null ) { try { generator.close(); } catch (Throwable var25) { var10.addSuppressed(var25); } } else { generator.close(); } } } } catch (InvalidDefinitionException var28) { throw new HttpMessageConversionException ("Type definition error: " + var28.getType(), var28); } catch (JsonProcessingException var29) { throw new HttpMessageNotWritableException ("Could not write JSON: " + var29.getOriginalMessage(), var29); } } }
확인 요청시 메세지 컨버터를 통해 변환하려면 요청 바디에 실어 보내야 한다.
1 2 3 4 5 6 ### POST localhost:8081/welcome Content-Type: welcome/request Accept: welcome/response;q=0.8, application/json;q=1.0 song
응답은 예상대로 Welcome
이 추가되서 내려온다.
1 2 3 4 5 6 7 8 9 10 11 12 POST http://localhost:8081/welcome HTTP/1.1 200 Content-Type: welcome/response;charset=UTF-8 Transfer-Encoding: chunked Date: Wed, 23 Jun 2021 12:18:40 GMT Keep-Alive: timeout=60 Connection: keep-alive {"welcomeMessage":"Welcome song"} Response code: 200; Time: 107ms; Content length: 33 bytes
Reference
Source Repository
메세지 컨버터는 어떻게 동작할까 1
메세지 컨버터는 어떻게 동작할까 2
메세지 컨버터는 어떻게 동작할까 3