-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Description
I'm using Jackson 2.2.2 in a Dropwizard service. I'm attempting to create a resource method with a bounded type parameter:
@POST
public <P extends Period> P createPeriod(@PathParam(VERSION_ID) String versionId,
P period)
However, when I attempt to post JSON to this endpoint, com.yammer.dropwizard.jersey.JacksonMessageBodyProvider
deserializes the request as a LinkedHashMap
instead of a Period
. I believe there is enough information provided in the method declaration that Jackson should be able to deserialize this correctly. I've traced the problem to the TypeFactory#_fromVariable
method.
JacksonMessageBodyProvider
extends com.fasterxml.jackson.jaxrs.base.ProviderBase
and calls super.readFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String,String> httpHeaders, InputStream entityStream)
with the following arguments:
type: class Period
genericType: sun.reflect.generics.reflectiveObjects.TypeVariableImpl with name "P"
annotations: []
mediaType: application/json
and the provided headers and stream
This ends up calling the last line in ProviderBase#readFrom
:
return reader.withType(genericType).readValue(jp);
ObjectReader#withType
eventually calls TypeFactory#constructType(Type type)
, which passes a null
context to _constructType(Type type, TypeBindings context)
. Since type
is an instance of TypeVariable
, it ends up calling TypeFactory#_fromVariable(TypeVariable<?> type, TypeBindings context)
.
Since context
is null
, this method immediately returns _unknownType()
, which means the object ends up deserialized as a LinkedHashMap
. However, if I call getBounds()
on the type
object while in the _fromVariable
method, it returns an array containing Period.class
. It seems that if we didn't short-circuit due to the null context, _fromVariable
would eventually return the right type on the last line: return _constructType(bounds[0], context);
I've searched and couldn't find this exact issue. I looked at the latest code and see the same line, so I don't think upgrading would help.