2014-02-18 2 views
0

Есть ли способ отключить расширение для классов модели игровых фреймов? Причина, по которой я прошу об этом, заключается в том, что я хочу сериализовать объекты модели в JSON, но как только сериализатор json коснется любой неинициализированной модели, , эта модель будет инициализирована, что приведет к дополнительному удару базы данных, и полученный json будет раздуваться с ненужными объектами модели. Я попробовал исключить models.* из приложения.conf и с помощью ServerConfigStartup с этим вызовом serverConfig.addClass(Model.class) или с этим вызовом serverConfig.addPackage("models"), но ни один из них не работал на меня.Отключить расширение для классов модели Play Framework

ответ

0

Я нашел способ загрузки моделей, которые не нужны во время сериализации 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 также будет работать, но это не является надежным в долгосрочной перспективе, как Джеймс упомянул потому, что вы, возможно, есть необходимость в модели объекта, который вы игнорируете позже.

1

Ebean требует, чтобы классы моделей были расширены. Вы не можете использовать класс модели с ebean, если он не расширен.

Итак, ваши варианты: не используйте ebean или не сериализуйте свои объекты модели в JSON. Последнее считается лучшей практикой, привязка объектов данных REST API к вашим моделям баз данных не является хорошей идеей по причине проблемы, с которой вы сейчас сталкиваетесь - две модели обычно концептуально различны - модель базы данных имеет ссылки на другие моделей, а модель JSON - нет. Поэтому используйте разные классы для представления разных моделей.

Существует еще один вариант использования аннотаций Джексона, таких как @JsonIgnore, чтобы игнорировать эти свойства. Но на самом деле, это скользкий наклон, так как ваша кодовая база развивается, становится почти невозможно рассуждать о том, как будет выглядеть ваш JSON, когда вы начнете использовать больше этих аннотаций на своих классах и поддерживаете модели, гарантируя, что вы не сломаетесь ваш публичный API REST, становится кошмаром.

Смежные вопросы