package com.cassiomolin.patch.web.converter; import com.cassiomolin.patch.web.PatchMediaType; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.converter.AbstractHttpMessageConverter; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; import org.springframework.stereotype.Component; import javax.json.Json; import javax.json.JsonMergePatch; import javax.json.JsonReader; import javax.json.JsonWriter; /** * HTTP message converter for {@link JsonMergePatch}. * <p> * Only supports {@code application/merge-patch+json} media type. */ @Component public class JsonMergePatchHttpMessageConverter extends AbstractHttpMessageConverter<JsonMergePatch> { public JsonMergePatchHttpMessageConverter() { super(PatchMediaType.APPLICATION_MERGE_PATCH); } @Override protected boolean supports(Class<?> clazz) { return JsonMergePatch.class.isAssignableFrom(clazz); } @Override protected JsonMergePatch readInternal(Class<? extends JsonMergePatch> clazz, HttpInputMessage inputMessage) throws HttpMessageNotReadableException { try (JsonReader reader = Json.createReader(inputMessage.getBody())) { return Json.createMergePatch(reader.readValue()); } catch (Exception e) { throw new HttpMessageNotReadableException(e.getMessage(), inputMessage); } } @Override protected void writeInternal(JsonMergePatch jsonMergePatch, HttpOutputMessage outputMessage) throws HttpMessageNotWritableException { try (JsonWriter writer = Json.createWriter(outputMessage.getBody())) { writer.write(jsonMergePatch.toJsonValue()); } catch (Exception e) { throw new HttpMessageNotWritableException(e.getMessage(), e); } } }