दिलचस्प पोस्ट
वेबव्यू के साथ कस्टम फ़ॉन्ट का उपयोग कैसे करें क्यों हमेशा -1 लौटाता है सरणियों पर NSUserDefaults का उपयोग करना नियंत्रक में रेक कार्य को चलाएं मैं डेविस के साथ ईमेल पुष्टि कैसे तय करूं? कैसे जावास्क्रिप्ट में एक नंबर को गोल करने के लिए? MySQL की स्थापना और डॉकरफाइल के भीतर डंप को आयात करना गतिशील रूप से एक JDialog के लिए घटक जोड़ें आप एक सीमित वाइल्डकार्ड जेनेरिक में क्यों नहीं एकाधिक इंटरफेस कर सकते हैं? जहां जावाबेन्स का प्रयोग किया जाता है? रैखिक समय में सूची में दूसरी सबसे बड़ी संख्या प्राप्त करें ओपनसीवी: हर फ्रेम की प्रक्रिया करें Knockout.js कंटेनरलेस "foreach" <table> के साथ काम नहीं कर रहा है अपाचे HTTP क्लाइंट या यूआरएल कनेक्शन एसक्यूएल में "@" चिन्ह क्या करता है?

नॉन फ़ेक्ड आलसी ऑब्जेक्ट्स पर जैक्सन सीरियलाइजेशन से बचें

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

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

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.1, हाइबरनेट 4 और जैक्सन-मॉड्यूल-हाइबरनेट में स्प्रिंग 3.1 और पुराने संस्करणों के लिए एक अच्छा समाधान है। लेकिन संस्करण 3.1.2 के बाद से स्प्रिंग की मैपिंगजैकसन 2 एचटीटीपी मेसेज कनंवर्टर के पास ट्यूटोरियल में लगभग एक ही कार्यक्षमता है, इसलिए हमें इस कस्टम HTTPMessageConverter बनाने की आवश्यकता नहीं है।

Javaconfig के साथ हमें एक हाइबरनेटएवरऑब्जेक्टमैपर भी बनाने की आवश्यकता नहीं है, हमें बस हाइबरनेट 4 मॉड्यूल को डिफ़ॉल्ट मैपिंगजैकसन 2 एचटीटीपी मेसेज कन्वर्टर में जोड़ने की ज़रूरत है जो कि स्प्रिंग पहले से ही है और इसे एचटीटीपीएमसेज कन्वर्टर्स के आवेदन में जोड़ दिया गया है, इसलिए हमें इसकी आवश्यकता है:

  1. WebMvcConfigurerAdapter से हमारे स्प्रिंग कॉन्फ़िग क्लास को बढ़ाएं और विधि कॉन्फ़िगर मेसेज कन्वर्टर्स को ओवरराइड करें

  2. उस विधि पर मैपिंगजैकसन 2 एचटीटीपी मेसेज कन्वर्टर को प्रीबेयस विधि में पंजीकृत हाइबरनेट 4 मॉड्यूल के साथ जोड़ें।

हमारी कॉन्फ़िग क्लास इस तरह दिखनी चाहिए:

 @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 कॉन्फ़िगरेशन है, तो आपको अपना खुद का मैपिंगजैकसन 2 एचटीटीपी मेसेज कन्वर्टर बनाने की आवश्यकता नहीं है, लेकिन आपको ट्यूटोरियल (हाइबरनेटएवेयरऑब्जेक्ट मैपर) में दिखाई देने वाले निजीकृत मैपर को बनाने की आवश्यकता है, इसलिए आपका एक्सएमएल कॉन्फ़िग ऐसा दिखना चाहिए:

 <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> 

उम्मीद है कि यह उत्तर समझ में आता है और किसी को इस समस्या का हल ढूंढने में मदद करता है, कोई सवाल पूछने के लिए बेझिझक है!

यह @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 फ़ाइल

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

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

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

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

इस तरह:

 <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> 

`

स्प्रिंग डाटा शेष के मामले में, जबकि @ 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

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

 <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> 

आप स्प्रिंग डाटा शेष परियोजना से निम्नलिखित सहायक का उपयोग कर सकते हैं:

 Jackson2DatatypeHelper.configureObjectMapper(objectMapper); 

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

@ रिक के जवाब पर विस्तार, यहां ऑस्टैपरपर बनाने के लिए स्प्रिंग के जैक्सन 2 ऑब्जेक्टमैपरबिल्डर का उपयोग करके एक भिन्नता है यह "प्रसिद्ध मॉड्यूल" को स्वत: रजिस्टरों और 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() .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) .modulesToInstall(hibernate4Module()); return new MappingJackson2HttpMessageConverter(builder.build()); } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(jacksonMessageConverter()); super.configureMessageConverters(converters); } } 

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

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

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

आलसी लोडिंग के लिए // कस्टम विन्यास

 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);