Search in sources :

Example 1 with SimpleBeanPropertyDefinition

use of com.fasterxml.jackson.databind.util.SimpleBeanPropertyDefinition in project jackson-databind by FasterXML.

the class BeanDeserializerFactory method buildThrowableDeserializer.

@SuppressWarnings("unchecked")
public JsonDeserializer<Object> buildThrowableDeserializer(DeserializationContext ctxt, JavaType type, BeanDescription beanDesc) throws JsonMappingException {
    final DeserializationConfig config = ctxt.getConfig();
    // first: construct like a regular bean deserializer...
    BeanDeserializerBuilder builder = constructBeanDeserializerBuilder(ctxt, beanDesc);
    builder.setValueInstantiator(findValueInstantiator(ctxt, beanDesc));
    addBeanProps(ctxt, beanDesc, builder);
    // (and assume there won't be any back references)
    // But then let's decorate things a bit
    /* To resolve [JACKSON-95], need to add "initCause" as setter
         * for exceptions (sub-classes of Throwable).
         */
    AnnotatedMethod am = beanDesc.findMethod("initCause", INIT_CAUSE_PARAMS);
    if (am != null) {
        // should never be null
        SimpleBeanPropertyDefinition propDef = SimpleBeanPropertyDefinition.construct(ctxt.getConfig(), am, new PropertyName("cause"));
        SettableBeanProperty prop = constructSettableProperty(ctxt, beanDesc, propDef, am.getParameterType(0));
        if (prop != null) {
            /* 21-Aug-2011, tatus: We may actually have found 'cause' property
                 *   to set... but let's replace it just in case,
                 *   otherwise can end up with odd errors.
                 */
            builder.addOrReplaceProperty(prop, true);
        }
    }
    // And also need to ignore "localizedMessage"
    builder.addIgnorable("localizedMessage");
    // Java 7 also added "getSuppressed", skip if we have such data:
    builder.addIgnorable("suppressed");
    /* As well as "message": it will be passed via constructor,
         * as there's no 'setMessage()' method
        */
    builder.addIgnorable("message");
    // update builder now that all information is in?
    if (_factoryConfig.hasDeserializerModifiers()) {
        for (BeanDeserializerModifier mod : _factoryConfig.deserializerModifiers()) {
            builder = mod.updateBuilder(config, beanDesc, builder);
        }
    }
    JsonDeserializer<?> deserializer = builder.build();
    /* At this point it ought to be a BeanDeserializer; if not, must assume
         * it's some other thing that can handle deserialization ok...
         */
    if (deserializer instanceof BeanDeserializer) {
        deserializer = new ThrowableDeserializer((BeanDeserializer) deserializer);
    }
    // may have modifier(s) that wants to modify or replace serializer we just built:
    if (_factoryConfig.hasDeserializerModifiers()) {
        for (BeanDeserializerModifier mod : _factoryConfig.deserializerModifiers()) {
            deserializer = mod.modifyDeserializer(config, beanDesc, deserializer);
        }
    }
    return (JsonDeserializer<Object>) deserializer;
}
Also used : ThrowableDeserializer(com.fasterxml.jackson.databind.deser.std.ThrowableDeserializer) SimpleBeanPropertyDefinition(com.fasterxml.jackson.databind.util.SimpleBeanPropertyDefinition)

Example 2 with SimpleBeanPropertyDefinition

use of com.fasterxml.jackson.databind.util.SimpleBeanPropertyDefinition in project jackson-databind by FasterXML.

the class BeanDeserializerFactory method addReferenceProperties.

/**
     * 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();
            JavaType type;
            if (m instanceof AnnotatedMethod) {
                type = ((AnnotatedMethod) m).getParameterType(0);
            } else {
                type = m.getType();
            }
            SimpleBeanPropertyDefinition propDef = SimpleBeanPropertyDefinition.construct(ctxt.getConfig(), m);
            builder.addBackReferenceProperty(name, constructSettableProperty(ctxt, beanDesc, propDef, type));
        }
    }
}
Also used : SimpleBeanPropertyDefinition(com.fasterxml.jackson.databind.util.SimpleBeanPropertyDefinition)

Aggregations

SimpleBeanPropertyDefinition (com.fasterxml.jackson.databind.util.SimpleBeanPropertyDefinition)2 ThrowableDeserializer (com.fasterxml.jackson.databind.deser.std.ThrowableDeserializer)1