protected SettableBeanProperty _resolveManagedReferenceProperty(DeserializationContext paramDeserializationContext, SettableBeanProperty paramSettableBeanProperty) { String str1 = paramSettableBeanProperty.getManagedReferenceName(); if (str1 == null) return paramSettableBeanProperty; JsonDeserializer localJsonDeserializer1 = paramSettableBeanProperty.getValueDeserializer(); SettableBeanProperty localSettableBeanProperty; boolean bool; if ((localJsonDeserializer1 instanceof BeanDeserializerBase)) { localSettableBeanProperty = ((BeanDeserializerBase)localJsonDeserializer1).findBackReference(str1); bool = false; } else if ((localJsonDeserializer1 instanceof ContainerDeserializerBase)) { JsonDeserializer localJsonDeserializer2 = ((ContainerDeserializerBase)localJsonDeserializer1).getContentDeserializer(); if (!(localJsonDeserializer2 instanceof BeanDeserializerBase)) { String str2; if (localJsonDeserializer2 == null) str2 = "NULL"; else str2 = localJsonDeserializer2.getClass().getName(); throw new IllegalArgumentException("Can not handle managed/back reference '" + str1 + "': value deserializer is of type ContainerDeserializerBase, but content type is not handled by a BeanDeserializer (instead it's of type " + str2 + ")"); } localSettableBeanProperty = ((BeanDeserializerBase)localJsonDeserializer2).findBackReference(str1); bool = true; } else if ((localJsonDeserializer1 instanceof AbstractDeserializer)) { localSettableBeanProperty = ((AbstractDeserializer)localJsonDeserializer1).findBackReference(str1); bool = false; } else { throw new IllegalArgumentException("Can not handle managed/back reference '" + str1 + "': type for value deserializer is not BeanDeserializer or ContainerDeserializerBase, but " + localJsonDeserializer1.getClass().getName()); } if (localSettableBeanProperty == null) throw new IllegalArgumentException("Can not handle managed/back reference '" + str1 + "': no back reference property found from type " + paramSettableBeanProperty.getType()); JavaType localJavaType1 = this._beanType; JavaType localJavaType2 = localSettableBeanProperty.getType(); if (!localJavaType2.getRawClass().isAssignableFrom(localJavaType1.getRawClass())) throw new IllegalArgumentException("Can not handle managed/back reference '" + str1 + "': back reference type (" + localJavaType2.getRawClass().getName() + ") not compatible with managed type (" + localJavaType1.getRawClass().getName() + ")"); Annotations localAnnotations = this._classAnnotations; return new ManagedReferenceProperty(paramSettableBeanProperty, str1, localSettableBeanProperty, localAnnotations, bool); }
/** * Helper method called to see if given property is part of 'managed' property * pair (managed + back reference), and if so, handle resolution details. */ protected SettableBeanProperty _resolveManagedReferenceProperty(DeserializationContext ctxt, SettableBeanProperty prop) { String refName = prop.getManagedReferenceName(); if (refName == null) { return prop; } JsonDeserializer<?> valueDeser = prop.getValueDeserializer(); SettableBeanProperty backProp = null; boolean isContainer = false; if (valueDeser instanceof BeanDeserializerBase) { backProp = ((BeanDeserializerBase) valueDeser).findBackReference(refName); } else if (valueDeser instanceof ContainerDeserializerBase<?>) { JsonDeserializer<?> contentDeser = ((ContainerDeserializerBase<?>) valueDeser).getContentDeserializer(); if (!(contentDeser instanceof BeanDeserializerBase)) { String deserName = (contentDeser == null) ? "NULL" : contentDeser.getClass().getName(); throw new IllegalArgumentException("Can not handle managed/back reference '"+refName +"': value deserializer is of type ContainerDeserializerBase, but content type is not handled by a BeanDeserializer " +" (instead it's of type "+deserName+")"); } backProp = ((BeanDeserializerBase) contentDeser).findBackReference(refName); isContainer = true; } else if (valueDeser instanceof AbstractDeserializer) { backProp = ((AbstractDeserializer) valueDeser).findBackReference(refName); } else { throw new IllegalArgumentException("Can not handle managed/back reference '"+refName +"': type for value deserializer is not BeanDeserializer or ContainerDeserializerBase, but " +valueDeser.getClass().getName()); } if (backProp == null) { throw new IllegalArgumentException("Can not handle managed/back reference '"+refName+"': no back reference property found from type " +prop.getType()); } // also: verify that type is compatible JavaType referredType = _beanType; JavaType backRefType = backProp.getType(); if (!backRefType.getRawClass().isAssignableFrom(referredType.getRawClass())) { throw new IllegalArgumentException("Can not handle managed/back reference '"+refName+"': back reference type (" +backRefType.getRawClass().getName()+") not compatible with managed type (" +referredType.getRawClass().getName()+")"); } return new ManagedReferenceProperty(prop, refName, backProp, _classAnnotations, isContainer); }