Есть ли способ отключить расширение для классов модели игровых фреймов? Причина, по которой я прошу об этом, заключается в том, что я хочу сериализовать объекты модели в JSON, но как только сериализатор json коснется любой неинициализированной модели, , эта модель будет инициализирована, что приведет к дополнительному удару базы данных, и полученный json будет раздуваться с ненужными объектами модели. Я попробовал исключить models.*
из приложения.conf и с помощью ServerConfigStartup
с этим вызовом serverConfig.addClass(Model.class)
или с этим вызовом serverConfig.addPackage("models")
, но ни один из них не работал на меня.Отключить расширение для классов модели Play Framework
ответ
Я нашел способ загрузки моделей, которые не нужны во время сериализации json. Сначала я должен был изменить способ Джексон Сериализует модели объектов с помощью этого:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.PUBLIC_ONLY);
Это заставляет Джексона использовать поле непосредственно, но ваши модели поля должны быть открытыми. Этого еще недостаточно, потому что во время сериализации все еще будут загружены неинициализированные наборы моделей. Чтобы обойти эту проблему, мне пришлось обнулить наборы перед процессом сериализации с помощью отражения следующим образом:
for (Field field : model.getClass().getFields())
{
Object fieldObject = field.get(model);
if (fieldObject instanceof BeanSet)
{
BeanSet beanSet = (BeanSet) fieldObject;
//checks if the set is loaded or not
if (beanSet.isReference())
{
field.set(model, null);
}
}
}
Теперь ваша модели безопасно перейти к сериализатору Джексон без неинициализированных объектов модели, загруженных во время сериализации.
String jsonString = objectMapper.writeValueAsString(model);
JsonNode jsonNode = Json.parse(jsonString);
Использование @JsonIgnore
также будет работать, но это не является надежным в долгосрочной перспективе, как Джеймс упомянул потому, что вы, возможно, есть необходимость в модели объекта, который вы игнорируете позже.
Ebean требует, чтобы классы моделей были расширены. Вы не можете использовать класс модели с ebean, если он не расширен.
Итак, ваши варианты: не используйте ebean или не сериализуйте свои объекты модели в JSON. Последнее считается лучшей практикой, привязка объектов данных REST API к вашим моделям баз данных не является хорошей идеей по причине проблемы, с которой вы сейчас сталкиваетесь - две модели обычно концептуально различны - модель базы данных имеет ссылки на другие моделей, а модель JSON - нет. Поэтому используйте разные классы для представления разных моделей.
Существует еще один вариант использования аннотаций Джексона, таких как @JsonIgnore, чтобы игнорировать эти свойства. Но на самом деле, это скользкий наклон, так как ваша кодовая база развивается, становится почти невозможно рассуждать о том, как будет выглядеть ваш JSON, когда вы начнете использовать больше этих аннотаций на своих классах и поддерживаете модели, гарантируя, что вы не сломаетесь ваш публичный API REST, становится кошмаром.
- 1. Модели подпакетов в Play framework
- 2. Play Framework - Отключить пользователя
- 3. Использовать список в классе классов Play Framework
- 4. Play-framework: Hashtable в модели?
- 5. Play Framework не создает модели
- 6. Play Framework tmp диск с файлами классов
- 7. Entity Framework 4.1 DbContext Расширение частичных классов
- 8. Zend Framework: отключить автозагрузку базовых таблиц модели
- 9. Play Framework 2.3 WS SSL Отключить AlgorithmChecker
- 10. play framework: добавить внешний ключ к модели '@'?
- 11. Array [Byte] в модели Play Framework
- 12. Play Framework - создать форму без модели
- 13. Модели не сохраняются в Play Framework
- 14. Модуль Тестирование модели в Play Framework 2.3
- 15. Play framework: проанализировать XML до модели
- 16. Как SUM() поле в Play Framework модели
- 17. Расширение модели для добавления методов
- 18. DTO в Play Framework
- 19. Модели классов XCode: как просмотреть классы Framework?
- 20. Расширение общих классов классов для общего get_context_data
- 21. Entity Framework 4.1 Отключить проверку совместимости модели
- 22. Play Framework Authorization Java
- 23. Play Framework пользовательские расширения Java для шаблона
- 24. Play Framework Database Search
- 25. Полиморфное расширение для сторонних классов
- 26. Play Framework 2.0 и EBean, wrapping INFORMATION_SCHEMA
- 27. Play Framework супер класс
- 28. Play Framework - inheritence
- 29. Расширение внешних классов
- 30. Расширение метода доступа по умолчанию для сторонних разработчиков в платформе Java Play Framework