Maison >Java >javaDidacticiel >Comment empêcher Jackson de sérialiser des objets Hibernate récupérés paresseusement ?

Comment empêcher Jackson de sérialiser des objets Hibernate récupérés paresseusement ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-30 06:54:16419parcourir

How to Prevent Jackson from Serializing Lazy-Fetched Hibernate Objects?

Éviter la sérialisation de Jackson sur les objets récupérés paresseusement

Cet article aborde le défi consistant à empêcher Jackson de sérialiser des objets non récupérés et chargés paresseusement, ce qui peut résultat lié à Hibernate exceptions.

Introduction

Dans le scénario fourni, un objet utilisateur avec une liste de coordonnées récupérées paresseusement entraîne une exception « Impossible d'initialiser le proxy - pas de session » lorsque Jackson tente de sérialiser l'objet. En effet, Jackson récupère avec impatience les coordonnées avant la sérialisation, violant le mécanisme de chargement paresseux.

Solution

La solution consiste à intégrer un convertisseur de mappage personnalisé qui intègre le Hibernate4Module. Ce module améliore la prise en charge par Jackson des objets chargés paresseux.

Spring Java Configuration

  1. Créez une classe de configuration qui étend WebMvcConfigurerAdapter et remplace configureMessageConverters :
@Configuration
@EnableWebMvc
public class MyConfigClass extends WebMvcConfigurerAdapter{

    public MappingJackson2HttpMessageConverter jacksonMessageConverter(){
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Hibernate4Module());
        messageConverter.setObjectMapper(mapper);
        return messageConverter;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(jacksonMessageConverter());
        super.configureMessageConverters(converters);
    }
}
  1. Enregistrez le convertisseur personnalisé dans la liste HttpMessageConverters :
public @ResponseBody User getUser(@PathVariable String username) {
        
    User user = userService.getUser(username);
        
    return user;
        
}

Configuration XML Spring

  1. Créez un mappeur personnalisé, comme décrit dans le didacticiel lié :
<bean class="com.pastelstudios.json.HibernateAwareObjectMapper">
  1. Configurer le MappingJackson2HttpMessageConverter pour utiliser le mappeur personnalisé :
<mvc:message-converters>
    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="objectMapper" ref="hibernateAwareObjectMapper" />
    </bean>
</mvc:message-converters>

En implémentant cette solution, Jackson ne peut pas récupérer avec impatience les objets paresseux non récupérés pendant la sérialisation, résolvant ainsi l'exception et préservant le comportement de chargement paresseux.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn