При сериализации объекта Hibernate выдается странное исключение Джексона - PullRequest
61 голосов
/ 06 декабря 2010

Джексон выбрасывает странное исключение, которое я не знаю, как исправить.Я использую Spring, Hibernate и Jackson.

Я уже считал, что проблема связана с отложенной загрузкой, но я принял меры, чтобы Джексон НЕ обрабатывал различные свойства следующим образом:

@JsonIgnoreProperties({ "sentMessages", "receivedMessages", "educationFacility" })
public class Director extends UserAccount implements EducationFacilityUser {
   ....
}

Я сделал то же самое для всех других подклассов UserAccount.

Вот исключение:

org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: java.util.ArrayList[46]->jobprep.domain.educationfacility.Director_$$_javassist_2["handler"])
    at org.codehaus.jackson.map.ser.StdSerializerProvider$1.serialize(StdSerializerProvider.java:62)
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:268)
    at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:146)
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:118)
    at org.codehaus.jackson.map.ser.ContainerSerializers$IndexedListSerializer.serializeContents(ContainerSerializers.java:236)
    at org.codehaus.jackson.map.ser.ContainerSerializers$IndexedListSerializer.serializeContents(ContainerSerializers.java:189)
    at org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:111)
    at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:296)
    at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:224)
    at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:925)
    at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.writeInternal(MappingJacksonHttpMessageConverter.java:153)

Предложения о том, как получить больше информации, чтобы увидетьчто вызывает это?Кто-нибудь знает, как это исправить?

РЕДАКТИРОВАТЬ: Я обнаружил, что getHander () и другие методы get * () существуют на прокси-объекте.GRR !!Можно ли как-то сказать Джексону, чтобы он ничего не обрабатывал на прокси, или я сол?Это действительно странно, потому что метод, который выплевывает JSON, падает только при определенных обстоятельствах, а не постоянно.Тем не менее, это связано с методами get * () прокси-объекта.

В сторону: прокси - это зло.Они нарушают Джексона, equals () и многие другие части обычного Java-программирования.У меня возникает соблазн полностью отказаться от Hibernate: /

Ответы [ 15 ]

2 голосов
/ 20 июля 2012

Вы можете использовать @JsonIgnoreProperties(value = { "handler", "hibernateLazyInitializer" }) аннотацию для вашего класса "Директор"

0 голосов
/ 16 сентября 2016

Также вы можете сделать свой домен директором объекта final. Это не идеальное решение, но оно не позволяет создавать прокси-подкласс вашего класса домена.

0 голосов
/ 12 марта 2015

я пробовал @JsonDetect и

@JsonIgnoreProperties(value = { "handler", "hibernateLazyInitializer" })

Никто из них не работал на меня. Использование стороннего модуля показалось мне большой работой. Поэтому я просто попытался сделать get вызов любого свойства ленивого объекта, прежде чем перейти к jackson для серлизации. Фрагмент рабочего кода выглядел примерно так:

@RequestMapping(value = "/authenticate", produces = "application/json; charset=utf-8")
    @ResponseBody
    @Transactional
    public Account authenticate(Principal principal) {
        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = (UsernamePasswordAuthenticationToken) principal;
        LoggedInUserDetails loggedInUserDetails = (LoggedInUserDetails) usernamePasswordAuthenticationToken.getPrincipal();
        User user = userRepository.findOne(loggedInUserDetails.getUserId());
        Account account = user.getAccount();
        account.getFullName();      //Since, account is lazy giving it directly to jackson for serlization didn't worked & hence, this quick-fix.
        return account;
    }
0 голосов
/ 06 ноября 2013

Я столкнулся с той же проблемой, и действительно странно, что один и тот же код работает в нескольких случаях, тогда как в некоторых случайных случаях он не срабатывал

Я исправил это, просто убедившись в правильности установки / получения (убедившись в чувствительности к регистру)

0 голосов
/ 08 июня 2012

Я новичок в API Джексона, когда я получил «org.codehaus.jackson.map.JsonMappingException: не найден сериализатор для класса com.company.project.yourclass», я добавил геттер и сеттер в com.company. project.yourclass, который помог мне использовать объект mapper ObjectMapper для записи объекта java в плоский файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...