/** * Method that takes in exception of any type, and casts or wraps it * to an IOException or its subclass. */ protected void _throwAsIOE(Exception e, Object value) throws IOException { if (e instanceof IllegalArgumentException) { String actType = (value == null) ? "[NULL]" : value.getClass().getName(); StringBuilder msg = new StringBuilder("Problem deserializing property '").append(getPropertyName()); msg.append("' (expected type: ").append(getType()); msg.append("; actual type: ").append(actType).append(")"); String origMsg = e.getMessage(); if (origMsg != null) { msg.append(", problem: ").append(origMsg); } else { msg.append(" (no error message provided)"); } throw new JsonMappingException(msg.toString(), null, e); } _throwAsIOE(e); }
@Override public void deserializeAndSet(JsonParser jp, DeserializationContext ctxt, Object instance) throws IOException, JsonProcessingException { set(instance, _managedProperty.deserialize(jp, ctxt)); }
public Object processUnwrapped(JsonParser originalParser, DeserializationContext ctxt, Object bean, TokenBuffer buffered) throws IOException, JsonProcessingException { for (int i = 0, len = _properties.size(); i < len; ++i) { SettableBeanProperty prop = _properties.get(i); JsonParser jp = buffered.asParser(); jp.nextToken(); prop.deserializeAndSet(jp, ctxt, bean); } return bean; } }
public ManagedReferenceProperty(String refName, SettableBeanProperty forward, SettableBeanProperty backward, Annotations contextAnnotations, boolean isContainer) { super(forward.getName(), forward.getType(), forward._valueTypeDeserializer, contextAnnotations); _referenceName = refName; _managedProperty = forward; _backProperty = backward; _isContainer = isContainer; }
public void assignDeserializer(SettableBeanProperty prop, JsonDeserializer<Object> deser) { prop = prop.withValueDeserializer(deser); _properties.put(prop.getName(), prop); Object nullValue = deser.getNullValue(); if (nullValue != null) { if (_defaultValues == null) { _defaultValues = new Object[_properties.size()]; } _defaultValues[prop.getPropertyIndex()] = nullValue; } }
@Deprecated public void setValueDeserializer(JsonDeserializer<Object> deser) { if (_valueDeserializer != null) { // sanity check throw new IllegalStateException("Already had assigned deserializer for property '"+getName()+"' (class "+getDeclaringClass().getName()+")"); } _valueDeserializer = deser; Object nvl = _valueDeserializer.getNullValue(); _nullProvider = (nvl == null) ? null : new NullProvider(_type, nvl); }
SettableBeanProperty prop = origProp; if (!prop.hasValueDeserializer()) { prop = prop.withValueDeserializer(findDeserializer(config, provider, prop.getType(), prop)); if (prop.hasValueTypeDeserializer()) { TypeDeserializer typeDeser = prop.getValueTypeDeserializer(); if (typeDeser.getTypeInclusion() == JsonTypeInfo.As.EXTERNAL_PROPERTY) { if (extTypes == null) { if (!prop.hasValueDeserializer()) { _propertyBasedCreator.assignDeserializer(prop, findDeserializer(config, provider, prop.getType(), prop));
SettableBeanProperty prop) String refName = prop.getManagedReferenceName(); if (refName == null) { return prop; JsonDeserializer<?> valueDeser = prop.getValueDeserializer(); SettableBeanProperty backProp = null; boolean isContainer = false; isContainer = true; } else if (valueDeser instanceof AbstractDeserializer) { // [JACKSON-368]: not easy to fix, alas throw new IllegalArgumentException("Can not handle managed/back reference for abstract types (property "+_beanType.getRawClass().getName()+"."+prop.getName()+")"); } else { throw new IllegalArgumentException("Can not handle managed/back reference '"+refName +prop.getType()); JavaType backRefType = backProp.getType(); if (!backRefType.getRawClass().isAssignableFrom(referredType.getRawClass())) { throw new IllegalArgumentException("Can not handle managed/back reference '"+refName+"': back reference type ("
SettableBeanProperty prop = it.next(); if (!prop.hasValueDeserializer()) { prop.setValueDeserializer(findDeserializer(config, provider, prop.getType(), prop)); String refName = prop.getManagedReferenceName(); if (refName != null) { JsonDeserializer<?> valueDeser = prop._valueDeserializer; isContainer = true; } else if (valueDeser instanceof AbstractDeserializer) { // [JACKSON-368]: not easy to fix, alas throw new IllegalArgumentException("Can not handle managed/back reference for abstract types (property "+_beanType.getRawClass().getName()+"."+prop.getName()+")"); } else { throw new IllegalArgumentException("Can not handle managed/back reference '"+refName +prop.getType()); JavaType backRefType = backProp.getType(); if (!backRefType.getRawClass().isAssignableFrom(referredType.getRawClass())) { throw new IllegalArgumentException("Can not handle managed/back reference '"+refName+"': back reference type (" if (!prop.hasValueDeserializer()) { prop.setValueDeserializer(findDeserializer(config, provider, prop.getType(), prop));
if (!prop.hasValueDeserializer()) { _propertyBasedCreator.assignDeserializer(prop, findDeserializer(config, provider, prop.getType(), prop));
if (creatorProp != null) { Object value = creatorProp.deserialize(jp, ctxt); if (buffer.assignParameter(creatorProp.getPropertyIndex(), value)) { buffer.bufferProperty(prop, prop.deserialize(jp, ctxt)); continue;
if (prop.hasValueDeserializer()) { continue; prop.setValueDeserializer(findDeserializer(config, provider, prop.getType(), prop.getPropertyName(), seen)); prop.setValueDeserializer(findDeserializer(config, provider, prop.getType(), prop.getPropertyName(), seen));
public PropertyBasedCreator(ValueInstantiator valueInstantiator) { _valueInstantiator = valueInstantiator; _properties = new HashMap<String, SettableBeanProperty>(); // [JACKSON-372]: primitive types need extra care Object[] defValues = null; SettableBeanProperty[] creatorProps = valueInstantiator.getFromObjectArguments(); SettableBeanProperty[] propertiesWithInjectables = null; final int len = creatorProps.length; _propertyCount = len; for (int i = 0; i < len; ++i) { SettableBeanProperty prop = creatorProps[i]; _properties.put(prop.getName(), prop); if (prop.getType().isPrimitive()) { if (defValues == null) { defValues = new Object[len]; } defValues[i] = ClassUtil.defaultValue(prop.getType().getRawClass()); } Object injectableValueId = prop.getInjectableValueId(); if (injectableValueId != null) { if (propertiesWithInjectables == null) { propertiesWithInjectables = new SettableBeanProperty[len]; } propertiesWithInjectables[i] = prop; } } _defaultValues = defValues; _propertiesWithInjectables = propertiesWithInjectables; }
prop.deserializeAndSet(jp, ctxt, throwable); continue; pending[pendingIx++] = prop.deserialize(jp, ctxt); continue; for (int i = 0, len = pendingIx; i < len; i += 2) { prop = (SettableBeanProperty)pending[i]; prop.set(throwable, pending[i+1]); for (int i = 0, len = pendingIx; i < len; i += 2) { SettableBeanProperty prop = (SettableBeanProperty)pending[i]; prop.set(throwable, pending[i+1]);
/** * Method called to finalize setup of this deserializer, * after deserializer itself has been registered. This * is needed to handle recursive and transitive dependencies. */ public void resolve(DeserializationConfig config, DeserializerProvider provider) throws JsonMappingException { // just need to worry about property-based one if (_propertyBasedCreator != null) { // Need to / should not create separate HashMap<JavaType, JsonDeserializer<Object>> seen = new HashMap<JavaType, JsonDeserializer<Object>>(); for (SettableBeanProperty prop : _propertyBasedCreator.properties()) { prop.setValueDeserializer(findDeserializer(config, provider, prop.getType(), prop.getPropertyName(), seen)); } } }
beanDesc.getClassAnnotations(), field); if (propDeser != null) { prop = prop.withValueDeserializer(propDeser); prop.setManagedReferenceName(ref.getName());
@Override public void assign(Object bean) throws IOException, JsonProcessingException { _property.set(bean, value); } }
/** * Helper method called to see if given property might be so-called unwrapped * property: these require special handling. * * @since 1.9 */ protected SettableBeanProperty _resolveUnwrappedProperty(DeserializationConfig config, SettableBeanProperty prop) { AnnotatedMember am = prop.getMember(); if (am != null && config.getAnnotationIntrospector().shouldUnwrapProperty(am) == Boolean.TRUE) { JsonDeserializer<Object> orig = prop.getValueDeserializer(); JsonDeserializer<Object> unwrapping = orig.unwrappingDeserializer(); if (unwrapping != orig && unwrapping != null) { // might be cleaner to create new instance; but difficult to do reliably, so: return prop.withValueDeserializer(unwrapping); } } return null; }
@Override public String toString() { return "[property '"+getName()+"']"; }
JsonDeserializer<Object> deser = prop.getValueDeserializer(); ValueInstantiator vi = bd.getValueInstantiator(); if (!vi.canCreateUsingDefault()) { // no default constructor Class<?> valueClass = prop.getType().getRawClass(); Class<?> enclosing = ClassUtil.getOuterClass(valueClass);