if (type == null) {
return Variables.untypedValue(value);
}
ValueType valueType = valueTypeResolver.typeForName(fromRestApiTypeName(type));
if(valueType == null) {
throw new RestException(Status.BAD_REQUEST, String.format("Unsupported value type '%s'", type));
}
else {
if(valueType instanceof PrimitiveValueType) {
PrimitiveValueType primitiveValueType = (PrimitiveValueType) valueType;
Class<?> javaType = primitiveValueType.getJavaType();
Object mappedValue = null;
try {
if(value != null) {
if(javaType.isAssignableFrom(value.getClass())) {
mappedValue = value;
}
else {
// use jackson to map the value to the requested java type
mappedValue = objectMapper.readValue("\""+value+"\"", javaType);
}
}
return valueType.createValue(mappedValue, valueInfo);
}
catch (Exception e) {
throw new InvalidRequestException(Status.BAD_REQUEST, e,
String.format("Cannot convert value '%s' of type '%s' to java type %s", value, type, javaType.getName()));
}
}
else if(valueType instanceof SerializableValueType) {
if(value != null && !(value instanceof String)) {
throw new InvalidRequestException(Status.BAD_REQUEST, "Must provide 'null' or String value for value of SerializableValue type '"+type+"'.");
}
return ((SerializableValueType) valueType).createValueFromSerialized((String) value, valueInfo);
}
else {
return valueType.createValue(value, valueInfo);
}
}
}