Genson Caching of Bean Accessors

Я недавно обновился до Genson 1.3, и я не уверен на 100%, является ли эта проблема новой или нет, как ранее, я исправил версию 0.98, чтобы она заработала.

контекст

Мы используем нашу собственную реализацию BeanMutatorAccessorResolver. Это сделано для того, чтобы мы могли динамически решать, следует ли сериализовать свойство или нет. По сути, мы интегрировали Genson в наш универсальный интерфейс REST API. Дженсон все сериализует и десериализует. При выполнении запросов GET пользователь может передавать поля в URL-адресе, чтобы отфильтровать те, которые ему конкретно нужны (особенно для больших объектов, это необходимо, когда для отображения обзора таблицы требуется только три поля или около того). Например:? Fields=field1, field2, field3. Затем мы знаем в нашей реализации BeanMutatorAccessorResolver, какие именно поля нужно сериализовать, а какие игнорировать. Это в основном предназначено для ускорения запросов и анализа, так как тогда мы работаем с меньшим количеством данных.

проблема

К сожалению, кажется, что, когда Генсон прочитал все поля с помощью размышлений или чего-то еще, он кеширует это. Это не было бы проблемой, если бы мы всегда запрашивали одни и те же поля. К сожалению, в некоторых случаях нам нужно больше полей, чем раньше, но поскольку Genson не посещает наш BeanMutatorAccessorResolver во второй раз, он возвращает только несколько полей, которые он уже кэшировал.

Есть ли что-нибудь вокруг этого? Возможно, есть лучшее решение, чем полное отключение кэширования, потому что это, скорее всего, ухудшит производительность, верно?

Обновить

Кажется, я нашел место, где это происходит. В основном Genson возвращает кэшированный конвертер в Genson.provideConverter(Type forType) (строка: 154).

Converter<T> converter = (Converter<T>) converterCache.get(forType);

В начале метода я заметил, что он ищет __GENSON$DO_NOT_CACHE_CONVERTER.

if (Boolean.TRUE.equals(ThreadLocalHolder.get("__GENSON$DO_NOT_CACHE_CONVERTER", Boolean.class))) {

Должен ли я установить это значение или есть лучшее решение?

1 ответ

Проблема была решена благодаря Евгению. Решение можно найти здесь: https://groups.google.com/forum/.

В основном вам нужно расширить 3 класса, чтобы это работало:

  1. GensonBundle, который вы можете зарегистрировать в GensonBuilder.
  2. BaseBeanDescriptorProvider, который создается в GensonBundle.
  3. BeanDescriptor, который создается в BaseBeanDescriptorProvider и содержит метод сериализации для адаптации к вашим потребностям.
Другие вопросы по тегам