커스텀 메세지 컨버터 만들기
개요
메세지 컨버터를 통해 특정한 요청과 응답에 전용 메세지 컨버터를 적용시킴
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