diff --git a/dropwizard-jsonapi/src/main/java/io/rtr/jsonapi/JsonAPIRequest.java b/dropwizard-jsonapi/src/main/java/io/rtr/jsonapi/JsonAPIRequest.java new file mode 100644 index 0000000..e5e646e --- /dev/null +++ b/dropwizard-jsonapi/src/main/java/io/rtr/jsonapi/JsonAPIRequest.java @@ -0,0 +1,36 @@ +package io.rtr.jsonapi; + +import java.util.HashMap; + +public class JsonAPIRequest { + public Data data; + public Data getData() { + return data; + } + public void setData(Data data) { + this.data = data; + } + public class Data { + String type; + String id; + HashMap attributes; + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public HashMap getAttributes() { + return attributes; + } + public void setAttributes(HashMap attributes) { + this.attributes = attributes; + } + } +} diff --git a/dropwizard-jsonapi/src/main/java/io/rtr/jsonapi/filter/JsonApiFeature.java b/dropwizard-jsonapi/src/main/java/io/rtr/jsonapi/filter/JsonApiFeature.java index ef496f4..4b90ea2 100644 --- a/dropwizard-jsonapi/src/main/java/io/rtr/jsonapi/filter/JsonApiFeature.java +++ b/dropwizard-jsonapi/src/main/java/io/rtr/jsonapi/filter/JsonApiFeature.java @@ -26,6 +26,18 @@ protected void configure() { context.register(JsonApiResponseFilter.class); return true; } + if (!config.isRegistered(JsonApiRequestFilter.class)) { + context.register(new AbstractBinder() { + + @Override + protected void configure() { + bindAsContract(ResourceMappingContext.class).in(Singleton.class); + } + }); + + context.register(JsonApiRequestFilter.class); + return true; + } return false; } diff --git a/dropwizard-jsonapi/src/main/java/io/rtr/jsonapi/filter/JsonApiRequestFilter.java b/dropwizard-jsonapi/src/main/java/io/rtr/jsonapi/filter/JsonApiRequestFilter.java new file mode 100644 index 0000000..d6a5c3d --- /dev/null +++ b/dropwizard-jsonapi/src/main/java/io/rtr/jsonapi/filter/JsonApiRequestFilter.java @@ -0,0 +1,41 @@ +package io.rtr.jsonapi.filter; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.rtr.jsonapi.JsonAPIRequest; +import org.glassfish.jersey.message.internal.MediaTypes; + +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.ext.Provider; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +@Provider +public class JsonApiRequestFilter implements ContainerRequestFilter +{ + + public static final MediaType JSONAPI_MEDIATYPE = MediaType.valueOf("application/vnd.api+json"); + @Override + public void filter(ContainerRequestContext requestContext) + throws IOException + { + if (requestContext.hasEntity() && MediaTypes.typeEqual(JSONAPI_MEDIATYPE, requestContext.getMediaType())) + { + InputStream in = requestContext.getEntityStream(); + if (in.getClass() != ByteArrayInputStream.class) { + ObjectMapper objectMapper = new ObjectMapper(); + JsonAPIRequest jsonAPIRequest = objectMapper.readValue(in, JsonAPIRequest.class); + // Buffer input + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + objectMapper.writeValue(baos, jsonAPIRequest.getData().getAttributes()); + + //set the input to be the attributes field itself + in = new ByteArrayInputStream(baos.toByteArray()); + requestContext.setEntityStream(in); + } + } + } +} \ No newline at end of file