throws JsonMappingException final DeserializationConfig config = ctxt.getConfig(); BeanDeserializerBuilder builder = constructBeanDeserializerBuilder(ctxt, beanDesc); builder.setValueInstantiator(findValueInstantiator(ctxt, beanDesc)); addBeanProps(ctxt, beanDesc, builder); builder.addOrReplaceProperty(prop, true); builder.addIgnorable("localizedMessage"); builder.addIgnorable("suppressed"); if (_factoryConfig.hasDeserializerModifiers()) { for (BeanDeserializerModifier mod : _factoryConfig.deserializerModifiers()) { builder = mod.updateBuilder(config, beanDesc, builder); JsonDeserializer<?> deserializer = builder.build(); if (_factoryConfig.hasDeserializerModifiers()) { for (BeanDeserializerModifier mod : _factoryConfig.deserializerModifiers()) { deserializer = mod.modifyDeserializer(config, beanDesc, deserializer);
/** * Overridable method that constructs a {@link BeanDeserializerBuilder} * which is used to accumulate information needed to create deserializer * instance. */ protected BeanDeserializerBuilder constructBeanDeserializerBuilder(DeserializationContext ctxt, BeanDescription beanDesc) { return new BeanDeserializerBuilder(beanDesc, ctxt); }
valueInstantiator = findValueInstantiator(ctxt, builderDesc); } catch (NoClassDefFoundError error) { return new ErrorThrowingDeserializer(error); throw InvalidDefinitionException.from(ctxt.getParser(), ClassUtil.exceptionMessage(e), builderDesc, null); final DeserializationConfig config = ctxt.getConfig(); BeanDeserializerBuilder builder = constructBeanDeserializerBuilder(ctxt, builderDesc); builder.setValueInstantiator(valueInstantiator); addBeanProps(ctxt, builderDesc, builder); addObjectIdReader(ctxt, builderDesc, builder); addInjectables(ctxt, builderDesc, builder); JsonPOJOBuilder.Value builderConfig = builderDesc.findPOJOBuilderConfig(); final String buildMethodName = (builderConfig == null) ? JsonPOJOBuilder.DEFAULT_BUILD_METHOD : builderConfig.buildMethodName; builder.setPOJOBuilder(buildMethod, builderConfig); JsonDeserializer<?> deserializer = builder.buildBuilderBased( valueType, buildMethodName);
boolean hasViews) super(beanDesc.getType()); _beanType = beanDesc.getType(); _valueInstantiator = builder.getValueInstantiator(); _ignoreAllUnknown = ignoreAllUnknown; _anySetter = builder.getAnySetter(); List<ValueInjector> injectables = builder.getInjectables(); _injectables = (injectables == null || injectables.isEmpty()) ? null : injectables.toArray(new ValueInjector[injectables.size()]); _objectIdReader = builder.getObjectIdReader(); _nonStandardCreation = (_unwrappedPropertyHandler != null) || _valueInstantiator.canCreateUsingDelegate() JsonFormat.Value format = beanDesc.findExpectedFormat(null); _serializationShape = (format == null) ? null : format.getShape();
AnnotationIntrospector intr = ctxt.getAnnotationIntrospector(); boolean ignoreAny = false; Boolean B = intr.findIgnoreUnknownProperties(beanDesc.getClassInfo()); if (B != null) { ignoreAny = B.booleanValue(); builder.setIgnoreUnknownProperties(ignoreAny); Set<String> ignored = ArrayBuilders.arrayToSet(intr.findPropertiesToIgnore(beanDesc.getClassInfo())); for (String propName : ignored) { builder.addIgnorable(propName); AnnotatedMethod anySetter = beanDesc.findAnySetter(); if (anySetter != null) { builder.setAnySetter(constructAnySetter(ctxt, beanDesc, anySetter)); builder.addIgnorable(propName); final boolean useGettersAsSetters = (ctxt.isEnabled(MapperFeature.USE_GETTERS_AS_SETTERS) && ctxt.isEnabled(MapperFeature.AUTO_DETECT_GETTERS)); List<BeanPropertyDefinition> propDefs = filterBeanProps(ctxt, beanDesc, builder, beanDesc.findProperties(), ignored); builder.addCreatorProperty(propDef); continue; builder.addProperty(prop);
final boolean isConcrete = !beanDesc.getType().isAbstract(); final SettableBeanProperty[] creatorProps = isConcrete ? builder.getValueInstantiator().getFromObjectArguments(ctxt.getConfig()) : null; final boolean hasCreatorProps = (creatorProps != null); JsonIgnoreProperties.Value ignorals = ctxt.getConfig() .getDefaultPropertyIgnorals(beanDesc.getBeanClass(), beanDesc.getClassInfo()); Set<String> ignored; if (ignorals != null) { boolean ignoreAny = ignorals.getIgnoreUnknown(); builder.setIgnoreUnknownProperties(ignoreAny); builder.addIgnorable(propName); builder.setAnySetter(constructAnySetter(ctxt, beanDesc, anySetter)); } else { builder.addIgnorable(propName); if (builder.hasIgnorable(propDef.getName())) { builder.addCreatorProperty(cprop); continue; builder.addProperty(prop);
throws JsonMappingException final boolean isConcrete = !beanDesc.getType().isAbstract(); final SettableBeanProperty[] creatorProps = isConcrete ? builder.getValueInstantiator().getFromObjectArguments(ctxt.getConfig()) : null; final boolean hasCreatorProps = (creatorProps != null); builder.setIgnoreUnknownProperties(ignoreAny); builder.addIgnorable(propName); AnnotatedMember anySetterField = null; if (anySetterMethod != null) { builder.setAnySetter(constructAnySetter(ctxt, beanDesc, anySetterMethod)); builder.setAnySetter(constructAnySetter(ctxt, beanDesc, anySetterField)); builder.addIgnorable(propName); final boolean useGettersAsSetters = ctxt.isEnabled(MapperFeature.USE_GETTERS_AS_SETTERS) List<BeanPropertyDefinition> propDefs = filterBeanProps(ctxt, builder.addCreatorProperty(cprop); continue; builder.addProperty(prop);
ValueInstantiator valueInstantiator = findValueInstantiator(ctxt, beanDesc); BeanDeserializerBuilder builder = constructBeanDeserializerBuilder(ctxt, beanDesc); builder.setValueInstantiator(valueInstantiator); addBeanProps(ctxt, beanDesc, builder); addObjectIdReader(ctxt, beanDesc, builder); addInjectables(ctxt, beanDesc, builder); final DeserializationConfig config = ctxt.getConfig(); if (_factoryConfig.hasDeserializerModifiers()) { for (BeanDeserializerModifier mod : _factoryConfig.deserializerModifiers()) { builder = mod.updateBuilder(config, beanDesc, builder); deserializer = builder.buildAbstract(); } else { deserializer = builder.build(); if (_factoryConfig.hasDeserializerModifiers()) { for (BeanDeserializerModifier mod : _factoryConfig.deserializerModifiers()) { deserializer = mod.modifyDeserializer(config, beanDesc, deserializer);
valueInstantiator = findValueInstantiator(ctxt, beanDesc); } catch (NoClassDefFoundError error) { return new ErrorThrowingDeserializer(error); throw InvalidDefinitionException.from(ctxt.getParser(), ClassUtil.exceptionMessage(e), beanDesc, null); BeanDeserializerBuilder builder = constructBeanDeserializerBuilder(ctxt, beanDesc); builder.setValueInstantiator(valueInstantiator); addBeanProps(ctxt, beanDesc, builder); addObjectIdReader(ctxt, beanDesc, builder); addInjectables(ctxt, beanDesc, builder); final DeserializationConfig config = ctxt.getConfig(); if (_factoryConfig.hasDeserializerModifiers()) { for (BeanDeserializerModifier mod : _factoryConfig.deserializerModifiers()) { builder = mod.updateBuilder(config, beanDesc, builder); deserializer = builder.buildAbstract(); } else { deserializer = builder.build(); if (_factoryConfig.hasDeserializerModifiers()) { for (BeanDeserializerModifier mod : _factoryConfig.deserializerModifiers()) { deserializer = mod.modifyDeserializer(config, beanDesc, deserializer);
BeanDescription beanDesc, BeanDeserializerBuilder builder) final Class<?> beanClass = beanDesc.getBeanClass(); config, collector, builder.getProperties()); builder.addOrReplaceProperty(prop.withMutator(baseMutator), true); ValueInstantiator inst = builder.getValueInstantiator(); inst = new CreatorOptimizer(beanClass, _classLoader, (StdValueInstantiator) inst).createOptimized(); if (inst != null) { builder.setValueInstantiator(inst);
Map<String,AnnotatedMember> refs = beanDesc.findBackReferenceProperties(); if (refs != null) { for (Map.Entry<String, AnnotatedMember> en : refs.entrySet()) { JavaType type; if (m instanceof AnnotatedMethod) { type = ((AnnotatedMethod) m).getParameterType(0); } else { type = m.getType(); ctxt.reportBadTypeDefinition(beanDesc, "Can not bind back references as Creator parameters: type %s (reference '%s', parameter index #%d)", beanDesc.getBeanClass().getName(), name, ((AnnotatedParameter) m).getIndex()); ctxt.getConfig(), m, PropertyName.construct(name)); builder.addBackReferenceProperty(name, constructSettableProperty(ctxt, beanDesc, propDef, type));
@Override public BeanDeserializerBuilder updateBuilder(DeserializationConfig config, BeanDescription beanDesc, BeanDeserializerBuilder builder) { Iterator<SettableBeanProperty> properties = builder.getProperties(); entities.getPersistentEntity(beanDesc.getBeanClass()).ifPresent(entity -> { while (properties.hasNext()) { SettableBeanProperty property = properties.next(); PersistentProperty<?> persistentProperty = entity.getPersistentProperty(property.getName()); if (persistentProperty == null) { continue; } if (associationLinks.isLookupType(persistentProperty)) { RepositoryInvokingDeserializer repositoryInvokingDeserializer = new RepositoryInvokingDeserializer(factory, persistentProperty); JsonDeserializer<?> deserializer = wrapIfCollection(persistentProperty, repositoryInvokingDeserializer, config); builder.addOrReplaceProperty(property.withValueDeserializer(deserializer), false); continue; } if (!associationLinks.isLinkableAssociation(persistentProperty)) { continue; } UriStringDeserializer uriStringDeserializer = new UriStringDeserializer(persistentProperty, converter); JsonDeserializer<?> deserializer = wrapIfCollection(persistentProperty, uriStringDeserializer, config); builder.addOrReplaceProperty(property.withValueDeserializer(deserializer), false); } }); return builder; }
Class<?> rawPropertyType = null; if (property.hasSetter()) { rawPropertyType = property.getSetter().getRawParameterType(0); } else if (property.hasField()) { rawPropertyType = property.getField().getRawType(); && (isIgnorableType(ctxt.getConfig(), beanDesc, rawPropertyType, ignoredTypes))) { builder.addIgnorable(name); continue;
@Override public BeanDeserializerBuilder updateBuilder(DeserializationConfig config, BeanDescription beanDesc, BeanDeserializerBuilder builder) { if (!thinnables.contains(beanDesc.getBeanClass())) { return builder; } for (String ignore : ignorables) { builder.addIgnorable(ignore); } return builder; }
/** * Method that will find if bean has any managed- or back-reference properties, * and if so add them to bean, to be linked during resolution phase. */ protected void addReferenceProperties(DeserializationContext ctxt, BeanDescription beanDesc, BeanDeserializerBuilder builder) throws JsonMappingException { // and then back references, not necessarily found as regular properties Map<String,AnnotatedMember> refs = beanDesc.findBackReferenceProperties(); if (refs != null) { for (Map.Entry<String, AnnotatedMember> en : refs.entrySet()) { String name = en.getKey(); AnnotatedMember m = en.getValue(); Type genericType; if (m instanceof AnnotatedMethod) { genericType = ((AnnotatedMethod) m).getGenericParameterType(0); } else { genericType = m.getRawType(); } SimpleBeanPropertyDefinition propDef = SimpleBeanPropertyDefinition.construct( ctxt.getConfig(), m); builder.addBackReferenceProperty(name, constructSettableProperty( ctxt, beanDesc, propDef, genericType)); } } }
@Override public BeanDeserializerBuilder updateBuilder(DeserializationConfig config, BeanDescription beanDesc, BeanDeserializerBuilder builder) { for (BeanPropertyDefinition propDef : beanDesc.findProperties()) { if (!propDef.hasGetter() || propDef.hasSetter()) { continue; } AnnotatedMember getter = propDef.getAccessor(); if (!Keeper.class.equals(getter.getRawType())) { continue; } builder.addOrReplaceProperty(new CustomGetterBeanProperty(propDef, getter), true); } return builder; }
/** * Overridable method that constructs a {@link BeanDeserializerBuilder} * which is used to accumulate information needed to create deserializer * instance. */ protected BeanDeserializerBuilder constructBeanDeserializerBuilder(DeserializationContext ctxt, BeanDescription beanDesc) { return new BeanDeserializerBuilder(beanDesc, ctxt.getConfig()); }
&& isIgnorableType(ctxt.getConfig(), property, rawPropertyType, ignoredTypes)) { builder.addIgnorable(name); continue;
@Override public BeanDeserializerBuilder updateBuilder(DeserializationConfig config, BasicBeanDescription beanDesc, BeanDeserializerBuilder builder) { Iterator<SettableBeanProperty> beanPropertyIterator = builder.getProperties(); while (beanPropertyIterator.hasNext()) { SettableBeanProperty settableBeanProperty = beanPropertyIterator.next(); if (PropertyName.equals(settableBeanProperty.getName())) { SettableBeanProperty newSettableBeanProperty = settableBeanProperty.withValueDeserializer(new CustomDeserializer()); builder.addOrReplaceProperty(newSettableBeanProperty, true); break;
protected BuilderAndPropertyMap constructBeanDeserializerBuilder(JavaType type) { BeanDescription beanDesc = serializerProvider.getConfig().introspect(type); BeanDeserializerBuilder builder; CustomBeanDeserializerFactory factory = CustomBeanDeserializerFactory.instance; DeserializationContext ctxt = ((DefaultDeserializationContext) deserializationContext).copy(); try { Field field = DeserializationContext.class.getDeclaredField("_config"); field.setAccessible(true); field.set(ctxt, deserializationConfig); // copy from factory.buildBeanDeserializer() ValueInstantiator valueInstantiator = factory.findValueInstantiator(ctxt, beanDesc); builder = new BeanDeserializerBuilder(beanDesc, ctxt); builder.setValueInstantiator(valueInstantiator); factory.addBeanProps(ctxt, beanDesc, builder); factory.addObjectIdReader(ctxt, beanDesc, builder); factory.addBackReferenceProperties(ctxt, beanDesc, builder); factory.addInjectables(ctxt, beanDesc, builder); } catch (Exception e) { throw new RuntimeException("Unexpected exception", e); } List<SettableBeanProperty> properties = new ArrayList<>(); Iterator<SettableBeanProperty> propertiesIter = builder.getProperties(); while (propertiesIter.hasNext()) { properties.add(propertiesIter.next()); } BeanPropertyMap propertyMap = new BeanPropertyMap(false, properties, Collections.<String, List<PropertyName>>emptyMap()); return new BuilderAndPropertyMap(builder, propertyMap, beanDesc); }