Как использовать JsonView в StdSerializer Jackson

Я создаю сериализатор, который расширяет StdSerializer для преобразования списка объектов во множество объектов в json.

Из

List<MyParentObject> myList = new LinkedList();    
public class MyParentObject{ private String nameOfObject; }

к

{
 "_elementNames":['object1','object2'],
 "object1":{...},
 "object2":{...}
}

Он работает благодаря моему сериализатору.

public class CustomElementListSerializer extends StdSerializer<List<AbstractElement>> {

    @Override
    public void serialize(List<AbstractElement> elements, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        List<String> eltNames = new LinkedList<>();
        System.err.println( serializerProvider.getActiveView());
        jsonGenerator.writeNull();
        for (AbstractElement element : elements) {
            String nameProperty = Element.getElement().getElementId();
            eltNames.add(nameProperty);
            jsonGenerator.writeFieldName(nameProperty);
            jsonGenerator.writeObject(element);                
        }          
        jsonGenerator.writeFieldName("_elementNames");
        jsonGenerator.writeStartArray();
        for (String eltName : eltNames) {
            jsonGenerator.writeString(eltName);
        }
        jsonGenerator.writeEndArray();        
    }
}

Но я не могу одновременно использовать @JsonView. Джексон не учитывает аннотацию внутри элементов, и serializerProvider.getActiveView() потерял информацию после одного рекурсивного вызова.

Как я могу решить свою проблему. Возможно, StdSerializer - не лучшее решение. Или я скучаю по тому, как учесть JsonView внутри StdSerializer с помощью метода

jsonGenerator.writeObject(element);
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
398
1

Ответы 1

Я нашел решение. Вы должны установить новый сопоставитель с конфигурацией текущего serializerProvider

ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
mapper.setConfig(serializerProvider.getConfig());
jsonGenerator.setCodec(mapper);

Другие вопросы по теме