Джексон - как найти активный JsonView во время выполнения

У меня есть объект пользовательского интерфейса, который обертывает объект JPA, и в конструкторе этого объекта пользовательского интерфейса я выполняю ленивую загрузку некоторых свойств. В том же конструкторе мне нужно знать, какой JsonView в данный момент активен, поэтому я не лениво загружаю некоторые поля, которые не нужны, если, скажем, это представление списка. Есть ли способ узнать из конструктора, что является текущим активным JsonView во время выполнения. Или есть другой способ добиться того, что я описал выше.

Мой текущий план создать собственный сериализатор, который во время сериализации будет вызывать setJsonView(Class jsonView) объекта, который он сериализует. Все мои сериализованные объекты должны будут поддерживать этот метод. Внутри этого метида я могу выполнять ленивую загрузку на основе уже известного представления json. Что-то вроде этого:

public class JsonViewSerializer extends JsonSerializer<BaseSerializableEntity> {

  @Override
  public void serialize(BaseSerializableEntity value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
    value.setJsonView(provider.getSerializationView());
    // need to pass serialization to base class...
  }

}

person Andrei V    schedule 24.09.2015    source источник


Ответы (1)


В настоящее время активное представление доступно через объект контекста (SerializerProvider или DeserializationContext), используя метод getActiveView().

person StaxMan    schedule 25.09.2015
comment
Итак, как мне получить SerializerProvider из конструктора? - person Andrei V; 10.10.2015
comment
Это невозможно сделать. Вам нужно будет определить вид из метода сериализации() сериализатора во время сериализации. - person StaxMan; 12.10.2015
comment
Спасибо. Я изложил свое решение вверху. Единственная непонятная часть — это как вызвать сериализацию функции сериализатора базового класса. Я только хочу ввести что-то в объект значения и передать управление обратно в базу. - person Andrei V; 13.10.2015
comment
@AndreiV, это немного сложнее, в зависимости от того, как вы регистрируете свой сериализатор. Если он зарегистрирован для типа, вы не можете просто найти оригинальный (поскольку вы фактически заменили его). Но вместо такой регистрации вы можете использовать BeanSerializerModifier (зарегистрированный через модуль), чтобы получить исходный сериализатор, сохранить ссылку на него, построить и вернуть собственный. Если это так, просто убедитесь, что реализовано ContextualSerializer, делегируйте этот вызов. - person StaxMan; 13.10.2015
comment
Я понимаю. Спасибо за вашу помощь StaxMan. - person Andrei V; 14.10.2015