Я разработал этот 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 игнорировать эти атрибуты?
Если проблема заключается в том, что GSON не может справиться с Hibernate прокси вы можете попытаться deproxify объект http://stackoverflow.com/questions/2216547/converting-hibernate-proxy-to-real-object. Если проблема заключается в том, что GSON запускает ленивое загрузочное исключение, вам нужно открыть сессию hibernate перед вызовом GSON (например, обычно весной, что означает, что вам все равно нужно быть в транзакционном блоке) –
Мы столкнулись с этой проблемой вместе с Adobe Flex. Тогда наше решение состояло в том, чтобы вообще не использовать Lazy Loading, но тогда у вас есть удар производительности. Возможно, вам захочется попробовать другую библиотеку JSON, такую как Jackson, чтобы узнать, может ли она лучше справляться с прошивками Hibernate? Или GSON предлагает какой-то пользовательский сериализатор? – CodeChimp
Моя проблема связана не с прокси-серверами (я не получаю никаких ошибок связанных с прокси-сервером), а в том, как Gson сериализует связанные объекты, пытаясь преобразовать каждый атрибут из них в Json. Я хотел бы, чтобы определенные объекты сериализовали только идентификаторы, а остальным их просто игнорировать (это последнее, что я знаю, как это сделать) –