दिलचस्प पोस्ट
Jquery.load () को कैसे रद्द करें? मैं एक सरणी की एक सटीक डुप्लिकेट प्रतिलिपि कैसे बनाऊं? डार्ट में एक फाइल कैसे अपलोड करें? EXC_BAD_ACCESS संकेत मिला डेटा फ्रेम में आर में डुप्लिकेट की गई पंक्तियाँ (2 कॉलम पर आधारित) खोजें 2 क्षेत्रों की तुलना करने के लिए MongoDb क्वेरी स्थिति जावा में HTTP शीर्षलेख एन्कोडिंग / डीकोडिंग क्या "सी ++ प्रोग्रामिंग लैंग्वेज" के 4 वी संस्करण खंड 36.3.6 के इस कोड से अच्छी तरह परिभाषित व्यवहार है? 64 बिट एंड्रॉइड-एल प्लेटफॉर्म पर 32 बिट नेटिव्ह लाइब्रेरी का उपयोग कैसे करें ग्राफ़ क्रियान्वयन सी ++ सी # HttpWebRequest प्रकार "अनुप्रयोग / x-www-form-urlencoded" – कैसे सामग्री निकाय में 'और' चरित्र भेजने के लिए? ब्राउज़र बंद पर कुकीज़ साफ़ करें जावा से फ़ोल्डर हटाने आप स्वचालित रूप से पीछे की ओर सफेद स्थान को कैसे हटा सकते हैं सीबेइन / सेंड के पीछे क्या कारण है?

स्प्रिंग एमवीसी से JSON के रूप में भेजने पर गतिशील रूप से जावा ऑब्जेक्ट से फ़ील्ड पर ध्यान न दें

मेरे पास इस तरह की मॉडल क्लास है, हायबरनेट के लिए

@Entity @Table(name = "user", catalog = "userdb") @JsonIgnoreProperties(ignoreUnknown = true) public class User implements java.io.Serializable { private Integer userId; private String userName; private String emailId; private String encryptedPwd; private String createdBy; private String updatedBy; @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "UserId", unique = true, nullable = false) public Integer getUserId() { return this.userId; } public void setUserId(Integer userId) { this.userId = userId; } @Column(name = "UserName", length = 100) public String getUserName() { return this.userName; } public void setUserName(String userName) { this.userName = userName; } @Column(name = "EmailId", nullable = false, length = 45) public String getEmailId() { return this.emailId; } public void setEmailId(String emailId) { this.emailId = emailId; } @Column(name = "EncryptedPwd", length = 100) public String getEncryptedPwd() { return this.encryptedPwd; } public void setEncryptedPwd(String encryptedPwd) { this.encryptedPwd = encryptedPwd; } public void setCreatedBy(String createdBy) { this.createdBy = createdBy; } @Column(name = "UpdatedBy", length = 100) public String getUpdatedBy() { return this.updatedBy; } public void setUpdatedBy(String updatedBy) { this.updatedBy = updatedBy; } } 

स्प्रिंग एमवीसी नियंत्रक में, डीएओ का उपयोग करते हुए, मैं ऑब्जेक्ट प्राप्त करने में सक्षम हूं। और JSON ऑब्जेक्ट के रूप में लौट रहा है।

 @Controller public class UserController { @Autowired private UserService userService; @RequestMapping(value = "/getUser/{userId}", method = RequestMethod.GET) @ResponseBody public User getUser(@PathVariable Integer userId) throws Exception { User user = userService.get(userId); user.setCreatedBy(null); user.setUpdatedBy(null); return user; } } 

AngularJS का उपयोग करके हिस्सा देखें, इसलिए इसे इस तरह से JSON मिलेगा

 { "userId" :2, "userName" : "john", "emailId" : "john@gmail.com", "encryptedPwd" : "Co7Fwd1fXYk=", "createdBy" : null, "updatedBy" : null } 

अगर मैं एन्क्रिप्टेड पासवर्ड सेट नहीं करना चाहता, तो मैं उस फ़ील्ड को शून्य के रूप में भी सेट करूँगा।

लेकिन मैं ऐसा नहीं चाहता, मैं सभी क्षेत्रों को क्लाइंट पक्ष में भेजना नहीं चाहता। यदि मुझे पासवर्ड नहीं चाहिए, अपडेट किया जाता है, भेजने के लिए फ़ील्ड के द्वारा, मेरा परिणाम JSON होना चाहिए

 { "userId" :2, "userName" : "john", "emailId" : "john@gmail.com" } 

फ़ील्ड की सूची जिसे मैं क्लाइंट को अन्य डेटाबेस टेबल से भेजना नहीं चाहता। तो यह उस उपयोगकर्ता के आधार पर बदल जाएगा जो लॉग इन हुआ है। मैं यह कैसे कर सकता हूं?

मुझे आशा है कि आपको मेरा प्रश्न मिला

Solutions Collecting From Web of "स्प्रिंग एमवीसी से JSON के रूप में भेजने पर गतिशील रूप से जावा ऑब्जेक्ट से फ़ील्ड पर ध्यान न दें"

 Add the annotation @JsonIgnoreProperties("fieldname") to your POJO. 

या आप @JsonIgnore भी उपयोग फ़ील्ड नाम से पहले कर सकते हैं @JsonIgnore आप @JsonIgnore deserializing करते समय अनदेखा करना चाहते हैं

उदाहरण :

  @JsonIgnore @JsonProperty(value = "user_password") public java.lang.String getUserPassword() { return userPassword; } 

GitHub उदाहरण

मुझे पता है कि मैं पार्टी के लिए थोड़ा देर कर रहा हूं, लेकिन वास्तव में मैं कुछ महीनों पहले ही इस पर चला गया सभी उपलब्ध समाधान मेरे लिए बहुत ही आकर्षक नहीं थे (मिक्सिक्स! यूग!), इसलिए मैंने इस प्रक्रिया को क्लियर करने के लिए एक नई लाइब्रेरी बनाई। यह यहां उपलब्ध है अगर कोई इसे बाहर की कोशिश करना चाहे: https://github.com/monitorjbl/spring-json-view

मूल उपयोग बहुत आसान है, आप अपने नियंत्रक तरीकों में JsonView वस्तु का उपयोग इस प्रकार करते हैं:

 import com.monitorjbl.json.JsonView; import static com.monitorjbl.json.Match.match; @RequestMapping(method = RequestMethod.GET, value = "/myObject") @ResponseBody public void getMyObjects() { //get a list of the objects List<MyObject> list = myObjectService.list(); //exclude expensive field JsonView.with(list).onClass(MyObject.class, match().exclude("contains")); } 

आप इसे वसंत के बाहर भी उपयोग कर सकते हैं:

 import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import static com.monitorjbl.json.Match.match; ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(JsonView.class, new JsonViewSerializer()); mapper.registerModule(module); mapper.writeValueAsString(JsonView.with(list) .onClass(MyObject.class, match() .exclude("contains")) .onClass(MySmallObject.class, match() .exclude("id")); 

@JsonInclude(JsonInclude.Include.NON_NULL) जोड़ें @JsonInclude(JsonInclude.Include.NON_NULL) (जेक्सन को रिक्त मानों को क्रमबद्ध करने के लिए मजबूर करता है) कक्षा के साथ-साथ पासवर्ड फ़ील्ड के लिए @JsonIgnore

आप निश्चित रूप से @JsonIgnore गया @ जेसन इग्नोर बना सकते हैं और अपडेट किया जा सकता है, साथ ही यदि आप हमेशा इस विशेष मामले में न केवल अनदेखा करना चाहते हैं

अद्यतन करें

ऐसी घटना में आप पीओओओ को एनोटेशन जोड़ना नहीं चाहते हैं, एक बढ़िया विकल्प जैक्सन के मिक्सिन एनोटेशन हैं। दस्तावेज़ीकरण देखें

अगर मैं आप थे और ऐसा करना चाहते थे, तो मैं अपने उपयोगकर्ता इकाई को नियंत्रक परत में नहीं इस्तेमाल करूँगा। इसके बजाय मैं व्यापार (सर्विस) परत और नियंत्रक के साथ संवाद करने के लिए यूजरडॉ (डेटा ट्रांसफर ऑब्जेक्ट) का निर्माण और उपयोग करता हूं। आप उपयोगकर्ता इकाई से UserDto को डेटा की प्रतिलिपि बनाने के लिए अपाचे कन्वर्ट यूटल्स का उपयोग कर सकते हैं।

मुझे मेरे लिए स्प्रिंग और जैक्सन के साथ एक समाधान मिला है

पहले इकाई में फ़िल्टर का नाम निर्दिष्ट करें

 @Entity @Table(name = "SECTEUR") @JsonFilter(ModelJsonFilters.SECTEUR_FILTER) public class Secteur implements Serializable { /** Serial UID */ private static final long serialVersionUID = 5697181222899184767L; /** * Unique ID */ @Id @JsonView(View.SecteurWithoutChildrens.class) @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @JsonView(View.SecteurWithoutChildrens.class) @Column(name = "code", nullable = false, length = 35) private String code; /** * Identifiant du secteur parent */ @JsonView(View.SecteurWithoutChildrens.class) @Column(name = "id_parent") private Long idParent; @OneToMany(fetch = FetchType.LAZY) @JoinColumn(name = "id_parent") private List<Secteur> secteursEnfants = new ArrayList<>(0); } 

फिर आप देख सकते हैं कि स्प्रिंग कॉन्फिगरेशन में इस्तेमाल किए गए डिफ़ॉल्ट फ़िल्टरप्रदाता के साथ स्थिरांक नामों को फ़िल्टर करते हैं

 public class ModelJsonFilters { public final static String SECTEUR_FILTER = "SecteurFilter"; public final static String APPLICATION_FILTER = "ApplicationFilter"; public final static String SERVICE_FILTER = "ServiceFilter"; public final static String UTILISATEUR_FILTER = "UtilisateurFilter"; public static SimpleFilterProvider getDefaultFilters() { SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter.serializeAll(); return new SimpleFilterProvider().setDefaultFilter(theFilter); } } 

वसंत विन्यास:

 @EnableWebMvc @Configuration @ComponentScan(basePackages = "fr.sodebo") public class ApiRootConfiguration extends WebMvcConfigurerAdapter { @Autowired private EntityManagerFactory entityManagerFactory; /** * config qui permet d'éviter les "Lazy loading Error" au moment de la * conversion json par jackson pour les retours des services REST<br> * on permet à jackson d'acceder à sessionFactory pour charger ce dont il a * besoin */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { super.configureMessageConverters(converters); MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ObjectMapper mapper = new ObjectMapper(); // config d'hibernate pour la conversion json mapper.registerModule(getConfiguredHibernateModule());// // inscrit les filtres json subscribeFiltersInMapper(mapper); // config du comportement de json views mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false); converter.setObjectMapper(mapper); converters.add(converter); } /** * config d'hibernate pour la conversion json * * @return Hibernate5Module */ private Hibernate5Module getConfiguredHibernateModule() { SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class); Hibernate5Module module = new Hibernate5Module(sessionFactory); module.configure(Hibernate5Module.Feature.FORCE_LAZY_LOADING, true); return module; } /** * inscrit les filtres json * * @param mapper */ private void subscribeFiltersInMapper(ObjectMapper mapper) { mapper.setFilterProvider(ModelJsonFilters.getDefaultFilters()); } } 

अंत में मैं बाकी कोन्स्टॉलर में विशिष्ट फ़िल्टर निर्दिष्ट कर सकता हूं जब मुझे इसकी आवश्यकता होती है ….

 @RequestMapping(value = "/{id}/droits/", method = RequestMethod.GET) public MappingJacksonValue getListDroits(@PathVariable long id) { LOGGER.debug("Get all droits of user with id {}", id); List<Droit> droits = utilisateurService.findDroitsDeUtilisateur(id); MappingJacksonValue value; UtilisateurWithSecteurs utilisateurWithSecteurs = droitsUtilisateur.fillLists(droits).get(id); value = new MappingJacksonValue(utilisateurWithSecteurs); FilterProvider filters = ModelJsonFilters.getDefaultFilters().addFilter(ModelJsonFilters.SECTEUR_FILTER, SimpleBeanPropertyFilter.serializeAllExcept("secteursEnfants")).addFilter(ModelJsonFilters.APPLICATION_FILTER, SimpleBeanPropertyFilter.serializeAllExcept("services")); value.setFilters(filters); return value; } 

UserJsonResponse क्लास का निर्माण नहीं करना चाहते और वांछित क्षेत्रों के साथ एक क्लीनर समाधान होना चाहिए?

जब आप सभी मॉडल को वापस देना चाहते हैं, तो सीधे एक जेएसओएन वापस लौटना एक अच्छा समाधान है। अन्यथा यह सिर्फ गंदा हो जाता है।

भविष्य में, उदाहरण के लिए आप एक जेएसओएन फ़ील्ड चाह सकते हैं जो किसी भी मॉडल क्षेत्र से मेल नहीं खाता है और फिर आप एक बड़ी समस्या में हैं।

समस्या को हल करने के लिए अपनी इकाई वर्ग में @JsonInclude(JsonInclude.Include.NON_NULL) जोड़ना

यह लीक जैसा होगा

 @Entity @JsonInclude(JsonInclude.Include.NON_NULL)