2013-09-17 3 views
0

Я разработал этот webapp, используя Spring MVC + Hibernate.Спящий доступ к объектам Json, использующим GSON

Я извлекаю все свои объекты в службе, а затем возвращаю их непосредственно в контроллер. Эти объекты обычно лениво инициализируются, поэтому коллекции пустые.

Так что для объекта пользователя:

User 
{ 
    int idUser; 
    City city; 
    String name; 
    List<User> friends; 
} 

я вернуть объект только с idUser и имя, город и друзья не инициализируются.

Я хочу использовать все мои методы обслуживания (без их модификации), чтобы обеспечить REST api, поэтому, если из моего ApiController я прошу получить пользователя с идентификатором 1, я получаю всю полезную информацию об этом пользователе в JSON.

Я пробовал использовать GSON, но как только он пытается jsonize объект города, он падает, потому что он был лениво инициализирован. То же самое касается коллекции друзей.

Для коллекций это не очень большая проблема, так как в моем api у меня будет другой URL-адрес запроса, где вы можете получить всех друзей с учетом идентификатора пользователя, но в случае отношений с одним объектом (например, город в этом пример), я хотел бы вернуть идентификатор города, который по определению Lazy loading действительно установлен.

Как я могу сказать GSON, чтобы jsonize только атрибут cityId города вместо всего объекта?

Будет ли исключение остальных коллекций хорошим решением, чтобы они не были преобразованы в JSON? Есть ли другой способ явно сказать GSON игнорировать эти атрибуты?

+0

Если проблема заключается в том, что GSON не может справиться с Hibernate прокси вы можете попытаться deproxify объект http://stackoverflow.com/questions/2216547/converting-hibernate-proxy-to-real-object. Если проблема заключается в том, что GSON запускает ленивое загрузочное исключение, вам нужно открыть сессию hibernate перед вызовом GSON (например, обычно весной, что означает, что вам все равно нужно быть в транзакционном блоке) –

+0

Мы столкнулись с этой проблемой вместе с Adobe Flex. Тогда наше решение состояло в том, чтобы вообще не использовать Lazy Loading, но тогда у вас есть удар производительности. Возможно, вам захочется попробовать другую библиотеку JSON, такую ​​как Jackson, чтобы узнать, может ли она лучше справляться с прошивками Hibernate? Или GSON предлагает какой-то пользовательский сериализатор? – CodeChimp

+0

Моя проблема связана не с прокси-серверами (я не получаю никаких ошибок связанных с прокси-сервером), а в том, как Gson сериализует связанные объекты, пытаясь преобразовать каждый атрибут из них в Json. Я хотел бы, чтобы определенные объекты сериализовали только идентификаторы, а остальным их просто игнорировать (это последнее, что я знаю, как это сделать) –

ответ

0

Я считаю, что вам нужно положить gson.toJson(...) в транзакцию, весной MVC обычно @Transactional в методе контроллера, где вы выполняете фактическую сериализацию.

Если вы действительно хотите пропустить поля или выборочно сериализовать поля использования Gson, вы можете проверить https://stackoverflow.com/a/3341439 для стратегии исключения gson. Вы можете пропустить на основе аннотации поля или имени поля или всего ссылочного класса.

Gson gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() { 
    public boolean shouldSkipClass(Class<?> clazz) { 
     return <class exclusion logic, return true for exclusion else false>; 
    } 
    public boolean shouldSkipField(FieldAttributes f) { 
     return <field exclusion logic>; 
    } 
}).create(); 
+0

Да, это более или менее то, что я в конечном итоге сделал. Благодарю. –

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