2015-11-16 3 views
1

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

Контекст

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

Проблема

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

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

Update

Is кажется, что я нашел место, где это происходит. В основном 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))) { 

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

+0

К сожалению, добавление строки "ThreadLocalHolder.store (" __ GENSON $ DO_NOT_CACHE_CONVERTER ", true);" к моему ресурсу класса «Джерси», похоже, тоже не помогает. – michaeldd

ответ

1

Проблема решена благодаря Юджину. Решение можно найти здесь: https://groups.google.com/forum/#!topic/genson/Z1oFHJfA-5w.

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

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