Динамически игнорировать свойства с помощью JacksonJson

Я знаю, что есть несколько способов указать JacksonJson игнорировать свойства во время рендеринга, но все они статичны. (JasonIgnore, MixIn классы, ..)

Это мой сценарий. Объект домена может реализовать интерфейс FilteredDomain для позволяют динамически фильтровать его. Интерфейс прост и предоставляет только один метод "getIgnoreProperties". (Список свойств, которые следует игнорировать.)

Затем я регистрирую пользовательский сериализатор, который связывается с объектом FilteredDomain. В код выглядит примерно так:

private class FilteredDomainSerializer extends JsonSerializer<FilteredDomain> {

    public void serialize(FilteredDomain arg, JsonGenerator jgen,
            SerializerProvider provder) throws IOException,
            JsonProcessingException {

        final BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(arg);

        for (PropertyDescriptor pd : wrapper.getPropertyDescriptors()) {
            final String name = pd.getName();

            if (arg.getIgnoreProperties().containsKey(name))
                continue;

            final Object value = wrapper.getPropertyValue(name);

            jgen.writeObjectField(name, value);
        }
    }
}

Во-первых, мне очень не нравится, что мне нужно использовать оболочку Spring Bean, чтобы получить список всех свойств и выполнить итерацию по ним (должен быть способ сделать это - jackson json).

Во-вторых, код все еще не работает. Я получаю сообщение об ошибке:

org.codehaus.jackson.JsonGenerationException: не удается записать имя поля, ожидая значения в org.codehaus.jackson.impl.JsonGeneratorBase._reportError (JsonGeneratorBase.java:480) в org.codehaus.jackson.impl.Utf8Generator.writeFieldName (Utf8Generator.java:270) в org.codehaus.jackson.JsonGenerator.writeObjectField (JsonGenerator.java:1088) в com.rootmusic.util.SystemJsonObjectMapper $ ValueObjectSerializer.serialize (SystemJsonObjectMapper.java:65) в com.rootmusic.util.SystemJsonObjectMapper $ ValueObjectSerializer.serialize (SystemJsonObjectMapper.java:1) в org.codehaus.jackson.map.ser.ContainerSerializers $ IndexedListSerializer.serializeContents (ContainerSerializers.java:304) в org.codehaus.jackson.map.ser.ContainerSerializers $ IndexedListSerializer.serializeContents (ContainerSerializers.java:254) в org.codehaus.jackson.map.ser.ContainerSerializers $ AsArraySerializer.serialize (ContainerSerializers.java:142) в org.codehaus.jackson.map.ser.MapSerializer.serializeFields (MapSerializer.java:287) в org.codehaus.jackson.map.ser.MapSerializer.serialize (MapSerializer.java:212) в org.codehaus.jackson.map.ser.MapSerializer.serialize (MapSerializer.java:23) в org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue (StdSerializerProvider.java:606) at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue (StdSerializerProvider.java:280)

8
задан Savvas Dalkitsis 14 March 2012 в 12:04
поделиться