गैर-प्राप्त आलसी वस्तुओं पर जैक्सन क्रमांकन से बचें


84

मेरे पास एक साधारण नियंत्रक है जो एक उपयोगकर्ता ऑब्जेक्ट को लौटाता है, इस उपयोगकर्ता के पास एक विशेषता निर्देशांक है जिसमें हाइबरनेट संपत्ति FetchType.AZY है।

जब मैं इस उपयोगकर्ता को प्राप्त करने की कोशिश करता हूं, तो मुझे उपयोगकर्ता ऑब्जेक्ट प्राप्त करने के लिए हमेशा सभी निर्देशांक लोड करने होते हैं, अन्यथा जब जैक्सन उपयोगकर्ता को क्रमबद्ध करने की कोशिश करता है तो अपवाद को फेंकता है:

com.fasterxml.jackson.databind.JsonMappingException: प्रॉक्सी को प्रारंभ नहीं कर सका - कोई सत्र नहीं

यह जैक्सन के कारण इस अधूरे ऑब्जेक्ट को लाने की कोशिश कर रहा है। यहाँ वस्तुएं हैं:

public class User{

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    @JsonManagedReference("user-coordinate")
    private List<Coordinate> coordinates;
}

public class Coordinate {

    @ManyToOne
    @JoinColumn(name = "user_id", nullable = false)
    @JsonBackReference("user-coordinate")
    private User user;
}

और नियंत्रक:

@RequestMapping(value = "/user/{username}", method=RequestMethod.GET)
public @ResponseBody User getUser(@PathVariable String username) {

    User user = userService.getUser(username);

    return user;

}

जैक्सन को यह बताने का एक तरीका है कि अनफ़िट की गई वस्तुओं को अनुक्रमित न करें? मैं 3 साल पहले पोस्ट किए गए अन्य उत्तरों को देख रहा हूं जो जैकसन-हाइबरनेट-मॉड्यूल को लागू कर रहे हैं। लेकिन शायद इसे एक नए जैकसन फीचर के साथ हासिल किया जा सकता है।

मेरे संस्करण हैं:

  • वसंत 3.2.5
  • हाइबरनेट 4.1.7
  • जैक्सन 2.2

अग्रिम में धन्यवाद।



धन्यवाद, मैं indybee, मैं ट्यूटोरियल देख रहा हूँ, वसंत 3.2.5 में पहले से ही एक MappingJackson2HttpMessageConverter है, लेकिन मैं इसका उपयोग गैर-प्राप्त आलसी वस्तु से बचने के लिए नहीं कर सकता, मैंने भी ट्यूटोरियल में एक को लागू करने की कोशिश की है, लेकिन कुछ भी नहीं। ..
r1ckr

1
क्या आप एक ही त्रुटि "प्रॉक्सी को प्रारंभ नहीं कर सके" या कुछ अलग कर रहे हैं? (मैंने स्प्रिंग 3.2.6 और हाइबरनेट 4.1.7 और
जैकसन

1
समझ गया!! संस्करण 3.1.2 के बाद से स्प्रिंग का अपना MappingJackson2HttpMessageConverter है और ट्यूटोरियल में एक का लगभग समान व्यवहार है, लेकिन समस्या यह थी कि मैं स्प्रिंग जावा कॉन्फिग का उपयोग कर रहा हूं और मैं javaconetigs से शुरू कर रहा हूं। मैं एक @Bean MappingJackson2HttpMessageConverter बनाने की कोशिश कर रहा था , बजाय इसे स्प्रिंग के HttpMessageConverters में जोड़ने के लिए, शायद यह उत्तर में स्पष्ट है :)
r1cket

खुशी है कि यह काम कर रहा है :)
indybee

जवाबों:


94

मैं अंत में हल मिल गया! मुझे एक सुराग देने के लिए indybee का धन्यवाद।

ट्यूटोरियल स्प्रिंग 3.1, हाइबरनेट 4 और जैक्सन-मॉड्यूल-हाइबरनेट में स्प्रिंग 3.1 और पुराने संस्करणों का अच्छा समाधान है। लेकिन संस्करण 3.1.2 के बाद से वसंत का अपना MappingJackson2HttpMessageConverter ट्यूटोरियल में लगभग एक ही कार्यक्षमता के साथ है, इसलिए हमें इस कस्टम HTTPMessageConverter बनाने की आवश्यकता नहीं है।

Javaconfig के साथ हमें एक HibernateAwareObjectMapper भी बनाने की आवश्यकता नहीं है, हमें बस डिफ़ॉल्ट MappingJackson2HttpMessage.onverter के लिए Hibernate4Module को जोड़ने की आवश्यकता है जो कि स्प्रिंग के पास पहले से ही है और इसे HttpMessageConverters के अनुप्रयोग में शामिल करना है, इसलिए हमें इसकी आवश्यकता है

  1. WebMvcConfigurerAdapter से हमारी स्प्रिंग कॉन्‍फ़िगरेशन क्लास बढ़ाएँ और विधि कॉन्‍फ़िगरेशन को हटाएं

  2. उस पद्धति पर एक प्रीविअस विधि में पंजीकृत Hibernate4Module के साथ MappingJackson2HttpMessageConverter जोड़ें ।

हमारे विन्यास वर्ग को इस तरह दिखना चाहिए:

@Configuration
@EnableWebMvc
public class MyConfigClass extends WebMvcConfigurerAdapter{

    //More configuration....

    /* Here we register the Hibernate4Module into an ObjectMapper, then set this custom-configured ObjectMapper
     * to the MessageConverter and return it to be added to the HttpMessageConverters of our application*/
    public MappingJackson2HttpMessageConverter jacksonMessageConverter(){
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();

        ObjectMapper mapper = new ObjectMapper();
        //Registering Hibernate4Module to support lazy objects
        mapper.registerModule(new Hibernate4Module());

        messageConverter.setObjectMapper(mapper);
        return messageConverter;

    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //Here we add our custom-configured HttpMessageConverter
        converters.add(jacksonMessageConverter());
        super.configureMessageConverters(converters);
    }

    //More configuration....
}

यदि आपके पास एक xml कॉन्फ़िगरेशन है, तो आपको अपना MappingJackson2HttpMessageConverter बनाने की आवश्यकता नहीं है, लेकिन आपको ट्यूटोरियल (HibernateAwareOjectMapper) में दिखाई देने वाले व्यक्तिगत मैपर बनाने की आवश्यकता है, इसलिए आपका xml कॉन्फ़िगरेशन इस तरह दिखना चाहिए:

<mvc:message-converters>
    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="objectMapper">
            <bean class="com.pastelstudios.json.HibernateAwareObjectMapper" />
        </property>
    </bean>
</mvc:message-converters>

आशा है कि यह उत्तर समझने योग्य होगा और किसी को इस समस्या का समाधान खोजने में मदद करेगा, कोई भी प्रश्न पूछने के लिए स्वतंत्र है!


3
समाधान साझा करने के लिए धन्यवाद। हालाँकि कुछ कोशिशों के बाद, मैंने पाया कि इस समय ( 2.4.2 ) लेटेस्ट जैकसन वसंत 4.0.6 के साथ काम नहीं करता है । मेरे पास अभी भी "कोई सत्र नहीं" त्रुटि है। केवल जब मैंने नीचे जैकसन संस्करण को 2.3.4 (या 2.4.2) पर वर्गीकृत किया, तो क्या यह काम करना शुरू कर दिया।
रॉबिन

1
MappingJackson2HttpMessageConverter बाहर इंगित करने के लिए धन्यवाद! मैं थोड़ी देर तक ऐसे ही क्लास की तलाश में था।
लांसप

1
आपका बहुत बहुत धन्यवाद! मैंने अभी-अभी इसका परीक्षण किया है और स्प्रिंग 4.2.4, जैक्सन 2.7.1-1 और जैक्सनडैप्टाइप 2.7.1 :) के साथ काम कर रहा है
इस्तार

1
यह स्प्रिंग डेटा रीस्ट में समस्या का समाधान नहीं करता है।
एलेसैंड्रो सी।

1
उसी समस्या को कैसे हल करें, यदि स्प्रिंग के स्थान पर स्प्रिंगबूट का उपयोग किया जाता है ?। मैंने हाइबरनेट 4 मॉड्यूल (जो कि वर्तमान में मेरे पास है संस्करण है) को पंजीकृत करने की कोशिश की है, लेकिन इससे मेरी समस्या हल नहीं हुई।
रंजीथ गम्पा

34

स्प्रिंग 4.2 के रूप में और स्प्रिंग बूट और javaconfig का उपयोग करते हुए, Hibernate4Module को पंजीकृत करना अब आपके कॉन्फ़िगरेशन में इसे जोड़ने के रूप में सरल है:

@Bean
public Module datatypeHibernateModule() {
  return new Hibernate4Module();
}

रेफरी: https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring


19
हाइबरनेट 5 (स्प्रिंग बूट के वर्तमान संस्करण में) के लिए, यह है Hibernate5Module। इसके अतिरिक्त एक निर्भरता की आवश्यकता है<groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-hibernate5</artifactId>
Zeemee

1
मेरे लिए स्प्रिंग बूट 2.1 पर भी काम किया। मुझे पागल करने लगा था।
वैन डेम

यह स्पष्ट नहीं है कि इसे कैसे लागू किया जाए। मुझे एक असंगत प्रकार की त्रुटि मिलती है।
अर्थमाइंड

2
बहुत बढ़िया! मेरे लिए स्प्रिंग बूट 2.0.6 और हाइबरनेट 5. के साथ काम किया
गरुड़

यह बहुत मददगार था। यह बताया जाना चाहिए कि एक सेम के रूप में Hibernate5Module वर्ग उदाहरण को पंजीकृत करना पर्याप्त नहीं है। यदि आप इसे सिंगल ऑब्जेक्टमैपर इंस्टेंस पर लागू करना चाहते हैं, तो आप मॉड्यूल को अपने स्प्रिंग-प्रबंधित वर्ग में शामिल कर सकते हैं और फिर ऑब्जेक्टमैपर उदाहरण के साथ इसे पंजीकृत कर सकते हैं। @Autowire मॉड्यूल jacksonHibernateModule; ObjectMapper मैपर = नया ObjectMapper (); mapper.registerModule (this.jacksonHibernateModule)।
gburgalum01

13

यह @rick द्वारा स्वीकृत समाधान के समान है।

यदि आप मौजूदा संदेश कन्वर्टर्स कॉन्फ़िगरेशन को स्पर्श नहीं करना चाहते हैं, तो आप बस Jackson2ObjectMapperBuilderसेम की घोषणा कर सकते हैं:

@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
    return new Jackson2ObjectMapperBuilder()
        .modulesToInstall(Hibernate4Module.class);
}

अपनी ग्रेड फ़ाइल (या मावेन) के लिए निम्नलिखित निर्भरता जोड़ना न भूलें:

compile 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate4:2.4.4'

यदि आपके पास उपयोगी है आवेदन और आप application.propertiesफ़ाइल से जैक्सन सुविधाओं को संशोधित करने की क्षमता रखना चाहते हैं ।


application.propertiesफ़ाइल का उपयोग करके हम इसे कैसे प्राप्त कर सकते हैं (जैक्सन कॉन्फ़िगर करके आलसी लोड की गई वस्तु से बचने के लिए) ?
हेमू

1
यही नहीं यहां कहा जा रहा है। @ लिलोस बेलोच के समाधान से पता चलता है कि आप जैक्सन 2 एक्सबजेक्टमैपबर्ब्यूलर बनाते हैं ताकि आप स्प्रिंग बूट डिफ़ॉल्ट संदेश कनवर्टर को ओवरराइड न करें और जैकसन गुणों को नियंत्रित करने के लिए एप्लिकेशन.प्रोपरेटी मानों का उपयोग करना जारी रखें।
kapad

क्षमा करें ... मैं नया हूँ जहाँ आप इस विधि को लागू करेंगे? स्प्रिंग बूट के साथ यह स्प्रिंग 5 का उपयोग करता है जो WebMvcConfigurerAdapter को हटा दिया गया है
एरिक हुआंग

Hibernate4Moduleविरासत है
दिमित्री कल्टोविच

8

स्प्रिंग डेटा रेस्ट के मामले में, जब @ r1ckr द्वारा पोस्ट किया गया समाधान काम करता है, तो यह आवश्यक है कि आपके हाइबरनेट संस्करण के आधार पर निम्नलिखित निर्भरताओं में से एक को जोड़ा जाए:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate4</artifactId>
    <version>${jackson.version}</version>
</dependency>

या

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>${jackson.version}</version>
</dependency>

स्प्रिंग डेटा रेस्ट के भीतर एक वर्ग है:

org.springframework.data.rest.webmvc.json.Jackson2DatatypeHelper

जो ऑटो स्टार्ट-अप का पता लगाएगा और आवेदन स्टार्ट-अप पर मॉड्यूल पंजीकृत करेगा।

हालांकि एक मुद्दा है:

अंक जारी करना आलसी @ManyToOne


जब आप स्प्रिंग डेटा रेस्ट का उपयोग नहीं कर रहे हैं तो आप इसे स्प्रिंग बूट से कैसे कॉन्फ़िगर कर सकते हैं?
एरिक हुआंग

पर्याप्त नहीं। आपको जरूरत भी है@Bean hibernate5Module()
दिमित्री कल्टोविच

4

यदि आप XML कॉन्फिगरेशन का उपयोग करते हैं और उपयोग करते हैं <annotation-driven />, तो मैंने पाया कि आपको जैक्सन जीथब खाते पर अनुशंसित अनुसार <message-converters>अंदर घोंसला बनाना होगा<annotation-driven>

इस तरह:

<annotation-driven>
  <message-converters>
    <beans:bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
      <beans:property name="objectMapper">
        <beans:bean class="com.pastelstudios.json.HibernateAwareObjectMapper" />
      </beans:property>
    </beans:bean> 
  </message-converters>
</annotation-driven>

`


xml विन्यास विरासत है
दिमित्री कल्टोविच

3

जो लोग अपाचे सीएक्सएफ-आधारित रैस्टफुल सेवा का समाधान खोजने के लिए यहां आए थे, उनके लिए इसे ठीक करने वाला कॉन्फ़िगरेशन निम्न है:

<jaxrs:providers>
    <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider">
        <property name="mapper" ref="objectMapper"/>
    </bean>
</jaxrs:providers>

<bean id="objectMapper" class="path.to.your.HibernateAwareObjectMapper"/>

HibernateAwareObjectMapper को कहां परिभाषित किया गया है:

public class HibernateAwareObjectMapper extends ObjectMapper {
    public HibernateAwareObjectMapper() {
        registerModule(new Hibernate5Module());
    }
}

जून 2016 तक निम्नलिखित निर्भरता आवश्यक है (बशर्ते आप हाइबरनेट 5 का उपयोग कर रहे हों):

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>2.7.4</version>
</dependency>  

1

निम्नलिखित समाधान स्प्रिंग 4.3, (गैर-बूट) और हाइबरनेट 5.1 के लिए है, जहां हमने प्रदर्शन कारणों के fetch=FetchType.LAZYमामलों से सभी भ्रूणों को संक्रमित किया fetch=FetchType.EAGERहै। तुरंत हमने देखाcom.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy आलसी लोड मुद्दे के कारण अपवाद को ।

सबसे पहले, हम निम्नलिखित मावेन निर्भरता को जोड़ते हैं:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
</dependency>  

फिर निम्नलिखित हमारे जावा MVC कॉन्फ़िगरेशन फ़ाइल में जोड़ा जाता है:

@Configuration
@EnableWebMvc 
public class MvcConfig extends WebMvcConfigurerAdapter {

@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {

    Hibernate5Module h5module = new Hibernate5Module();
    h5module.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION);
    h5module.enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING);

    for (HttpMessageConverter<?> mc : converters){
        if (mc instanceof MappingJackson2HttpMessageConverter || mc instanceof MappingJackson2XmlHttpMessageConverter) {
            ((AbstractJackson2HttpMessageConverter) mc).getObjectMapper().registerModule(h5module);
        }
    }
    return;
}

टिप्पणियाँ:

  • इस मॉड्यूल के बिना जैक्सन के समान व्यवहार प्राप्त करने के लिए आपको Hibernate5Module बनाने और कॉन्फ़िगर करने की आवश्यकता है। डिफ़ॉल्ट असंगत धारणाएं बनाता है।

  • हमारे WebMvcConfigurerAdapterपास इसमें बहुत सारे अन्य कॉन्फ़िगरेशन हैं और हम एक और कॉन्फ़िगरेशन क्लास से बचना चाहते थे, यही वजह है कि हमने WebMvcConfigurationSupport#addDefaultHttpMessageConvertersअन्य पोस्ट पर संदर्भित फ़ंक्शन का उपयोग नहीं किया ।

  • WebMvcConfigurerAdapter#configureMessageConvertersसंदेश कन्वर्टर्स के सभी स्प्रिंग के आंतरिक कॉन्फ़िगरेशन को अक्षम करता है। हमने इसके आसपास के संभावित मुद्दों से बचने को प्राथमिकता दी।

  • extendMessageConvertersअन्य सभी संदेश कन्वर्टर्स के कॉन्फ़िगरेशन को खोए बिना सभी स्वचालित रूप से कॉन्फ़िगर किए गए जैक्सन वर्गों तक सक्षम पहुंच का उपयोग करना ।

  • उपयोग करके getObjectMapper#registerModuleहम Hibernate5Moduleमौजूदा कन्वर्टर्स को जोड़ने में सक्षम थे ।

  • मॉड्यूल JSON और XML प्रोसेसर दोनों के लिए जोड़ा गया था

इस जोड़ ने हाइबरनेट और आलसी लोडिंग के साथ समस्या को हल किया लेकिन जेनसन प्रारूप के साथ एक अवशिष्ट समस्या का कारण बना । जैसा कि इस गितुब मुद्दे में बताया गया है , हाइबरनेट-जैकसन आलसी लोड मॉड्यूल वर्तमान में @JsonUnwrapped एनोटेशन को अनदेखा करता है, जिससे संभावित डेटा त्रुटियां होती हैं। यह बल-लोडिंग सुविधा सेटिंग की परवाह किए बिना होता है। यह समस्या 2016 से है।


ध्यान दें

ऐसा प्रतीत होता है कि निम्न-वर्गों को जोड़कर जो आलसी-लोडेड हैं, बिल्ट-इन ऑब्जेक्टमैपर हाइबरनेट 5 मॉड्यूल को जोड़े बिना काम करता है:

@JsonIgnoreProperties(  {"handler","hibernateLazyInitializer"} )
public class Anyclass {

समाधान बहुत आसान हो सकता है: kotlin @Bean fun hibernate5Module(): Module = Hibernate5Module()
दिमित्री Kaltovich


0

मैंने इस समस्या का बहुत ही सरल समाधान किया।

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public Set<Pendency> getPendencies() {
    return Hibernate.isInitialized(this.pendencies) ? Collections.unmodifiableSet(this.pendencies) : new HashSet<>();
}

मेरे मामले में मैं त्रुटि दे रहा था क्योंकि जब भी मैं एक पेंडेंसी वापस कर रहा था, एक अच्छे अभ्यास के रूप में मैंने इसे एक सूची में बदल दिया जिसे संशोधित नहीं किया जा सकता है, लेकिन जिस तरह से मैं उदाहरण प्राप्त करता था, उसके आधार पर यह आलसी हो सकता है या नहीं। (भ्रूण के साथ या बिना), मैं हाइबरनेट द्वारा आरंभ करने से पहले एक परीक्षण करता हूं और एनोटेशन को जोड़ता हूं जो एक खाली संपत्ति को अनुक्रमित करने से रोकता है और इससे मेरी समस्या हल हो गई।


0

मैंने उसी समस्या को हल करने के लिए पूरा दिन बिताया है। आप इसे मौजूदा संदेश कन्वर्टर्स कॉन्फ़िगरेशन को बदलने के बिना कर सकते हैं।

मेरी राय में इस समस्या को हल करने का सबसे आसान तरीका केवल 2 चरणों में जैकसन-डेटाटाइप-हाइबरनेट की मदद से है :

कोटलिन उदाहरण (जावा के समान):

  1. इसमें जोड़ें build.gradle.kts:
implementation("com.fasterxml.jackson.datatype:jackson-datatype-hibernate5:$jacksonHibernate")
  1. सृजन करना @Bean
   @Bean
   fun hibernate5Module(): Module = Hibernate5Module()

  • नोटिस जो Moduleहै com.fasterxml.jackson.databind.Module, नहींjava.util.Module

  • इसके अलावा अच्छा अभ्यास जोड़ने के लिए है @JsonBackReferenceऔर @JsonManagedReferenceकरने के लिए @OneToManyऔर @ManyToOneरिश्ते। @JsonBackReferenceकक्षा में केवल 1 हो सकता है।


-1

हालांकि यह सवाल इस एक से थोड़ा अलग है: अजीब जैक्सन अपवाद को फेंक दिया जा रहा है जब हाइबरनेट ऑब्जेक्ट को क्रमबद्ध करते हुए , अंतर्निहित समस्या को इस कोड के साथ उसी तरह से तय किया जा सकता है:

@Provider
public class MyJacksonJsonProvider extends JacksonJsonProvider {
    public MyJacksonJsonProvider() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
        setMapper(mapper);
    }
}

-1

मैंने यह कोशिश की, और काम किया:

// आलसी लोडिंग के लिए कस्टम कॉन्फ़िगरेशन

public static class HibernateLazyInitializerSerializer extends JsonSerializer<JavassistLazyInitializer> {

    @Override
    public void serialize(JavassistLazyInitializer initializer, JsonGenerator jsonGenerator,
            SerializerProvider serializerProvider)
            throws IOException, JsonProcessingException {
        jsonGenerator.writeNull();
    }
}

और मैपर कॉन्फ़िगर करें:

    mapper = new JacksonMapper();
    SimpleModule simpleModule = new SimpleModule(
            "SimpleModule", new Version(1,0,0,null)
    );
    simpleModule.addSerializer(
            JavassistLazyInitializer.class,
            new HibernateLazyInitializerSerializer()
    );
    mapper.registerModule(simpleModule);


-1

मैंने @ रिक के उपयोगी उत्तर की कोशिश की , लेकिन इस समस्या में भाग गया कि "जाने-माने मॉड्यूल" जैसे कि जैकसन-डेटाटाइप-जेएसआर 310 अपने आप को क्लासपाथ पर होने के बावजूद पंजीकृत नहीं किया गया था। (यह ब्लॉग पोस्ट ऑटो-पंजीकरण की व्याख्या करता है।)

@ रिक के जवाब पर विस्तार करते हुए, यहां स्प्रिंग की जैक्सन 2 एक्सबजेक्टमॅपरबर्ल का उपयोग करके भिन्नता बनाई गई है ObjectMapper। यह ऑटो "जाने-माने मॉड्यूल" को पंजीकृत करता है और स्थापित करने के अलावा कुछ खास सुविधाएं भी देता है Hibernate4Module

@Configuration
@EnableWebMvc
public class MyWebConfig extends WebMvcConfigurerAdapter {

    // get a configured Hibernate4Module
    // here as an example with a disabled USE_TRANSIENT_ANNOTATION feature
    private Hibernate4Module hibernate4Module() {
        return new Hibernate4Module().disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION);
    }

    // create the ObjectMapper with Spring's Jackson2ObjectMapperBuilder
    // and passing the hibernate4Module to modulesToInstall()
    private MappingJackson2HttpMessageConverter jacksonMessageConverter(){
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
                            .modulesToInstall(hibernate4Module());
        return new MappingJackson2HttpMessageConverter(builder.build());
  }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(jacksonMessageConverter());
        super.configureMessageConverters(converters);
    }
}

क्या आपके पास इस विषय के बारे में अपडेट है? मैं इस मुद्दे को वर्तमान में कर रहा हूँ। जब मैं जोड़ देता हूं hibernate5Module(क्योंकि 5 हाइबरनेट का उपयोग कर रहा हूं), तो जैकसन गैर-आरंभिक वस्तुओं के छद्म को अनदेखा करता है, लेकिन ऐसा लगता है कि मैं "उपयोग किए जाने वाले दृष्टिकोण" के बावजूद पंजीकृत नहीं हूं। मुझे यह पता है, क्योंकि मेरे आवेदन के कुछ हिस्से टूट गए हैं, और जब मैं मॉड्यूल को हटाता हूं, तो वे फिर से काम करते हैं।
डैनियल हेनाओ

@DanielHenao क्या आपने स्प्रिंग का अध्ययन किया है ।io/blog/2014/12/02/… ? मैंने हाइबरनेट 5 पर स्विच किया, जैक्सन-एंटपथ-फ़िल्टर द्वारा सुझाए गए DelegatingWebMvcConfigurationवर्ग (इसके बजाय WebMvcConfigurerAdapter) का उपयोग करते हुए :@Override public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters) { messageConverters.add(jacksonMessageConverter()); addDefaultHttpMessageConverters(messageConverters); }
मार्कस साइकेड्ट

1. Hibernate4Moduleविरासत है। 2 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS- सवाल के बारे में नहीं
दिमित्री Kaltovich

@DmitryKaltovich विज्ञापन 1) यह लेखन के समय विरासत नहीं था; विज्ञापन 2) ठीक है, हटा दिया गया।
मार्कस साइकेड्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.