আমার একই রকম সমস্যা ছিল তবে এটি হাইবারনেটের দ্বি-দিকনির্দেশক সম্পর্কের সাথে সম্পর্কিত। আমি সম্পর্কের এক দিকটি প্রদর্শন করতে চেয়েছিলাম এবং আমি কী দৃষ্টিভঙ্গি করছি তার উপর নির্ভর করে প্রোগ্রামগতভাবে অন্যটিকে অগ্রাহ্য করতে চাই। যদি আপনি এটি না করতে পারেন তবে আপনি শেষ বাজে StackOverflowException
। উদাহরণস্বরূপ, আমার যদি এই জিনিসগুলি থাকে
public class A{
Long id;
String name;
List<B> children;
}
public class B{
Long id;
A parent;
}
আমি প্রোগ্রামেটিক্যালি উপেক্ষা করার চাইবেন parent
বি মাঠে যদি আমি একটি দিকে তাকিয়ে করা হয়েছে, এবং উপেক্ষা children
একটি মাঠে যদি আমি বি এ খুঁজছেন সেটা
আমি এটি করতে মিক্সিনগুলি ব্যবহার শুরু করেছি, তবে এটি খুব দ্রুত ভয়ঙ্কর হয়ে ওঠে; আপনার কাছে প্রচুর অকেজো ক্লাস রয়েছে যা কেবলমাত্র ডেটা ফর্ম্যাট করার জন্য বিদ্যমান exist এটিকে ক্লিনার উপায়ে পরিচালনা করতে আমি নিজের সিরিয়ালাইজারটি লিখে শেষ করেছি: https://github.com/monitorjbl/json-view ।
এটি আপনাকে কর্মক্ষেত্রে কোন ক্ষেত্রগুলি উপেক্ষা করতে হবে তা প্রোগ্রামিকভাবে নির্দিষ্ট করতে দেয়:
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(JsonView.class, new JsonViewSerializer());
mapper.registerModule(module);
List<A> list = getListOfA();
String json = mapper.writeValueAsString(JsonView.with(list)
.onClass(B.class, match()
.exclude("parent")));
এটি আপনাকে ওয়াইল্ডকার্ড ম্যাথারগুলির মাধ্যমে খুব সরলীকৃত দর্শন সহজেই নির্দিষ্ট করতে দেয়:
String json = mapper.writeValueAsString(JsonView.with(list)
.onClass(A.class, match()
.exclude("*")
.include("id", "name")));
আমার মূল ক্ষেত্রে, এই জাতীয় মতামতগুলির প্রয়োজন ছিল পিতামাতার / সন্তানের সম্পর্কে সর্বাধিক ন্যূনতম প্রদর্শন করা, তবে এটি আমাদের ভূমিকা-ভিত্তিক সুরক্ষার জন্যও কার্যকর হয়ে ওঠে। অবজেক্ট সম্পর্কে কম তথ্য ফেরতের জন্য অবজেক্টগুলির কম সুবিধাযুক্ত দৃষ্টিভঙ্গি প্রয়োজন।
এগুলি সবই সিরিয়ালাইজার থেকে এসেছে তবে আমি আমার অ্যাপটিতে স্প্রিং এমভিসি ব্যবহার করছিলাম। এই কেসগুলি সঠিকভাবে পরিচালনা করতে এটি পেতে, আমি একটি ইন্টিগ্রেশন লিখেছি যা আপনি বিদ্যমান স্প্রিং কন্ট্রোলার ক্লাসে ফেলে যেতে পারেন:
@Controller
public class JsonController {
private JsonResult json = JsonResult.instance();
@Autowired
private TestObjectService service;
@RequestMapping(method = RequestMethod.GET, value = "/bean")
@ResponseBody
public List<TestObject> getTestObject() {
List<TestObject> list = service.list();
return json.use(JsonView.with(list)
.onClass(TestObject.class, Match.match()
.exclude("int1")
.include("ignoredDirect")))
.returnValue();
}
}
উভয়ই মাভেন সেন্ট্রালে উপলব্ধ। আমি আশা করি এটি অন্য কাউকে সাহায্য করবে, এটি জ্যাকসনের একটি বিশেষভাবে কুৎসিত সমস্যা যা আমার ক্ষেত্রে ভাল সমাধান করতে পারে নি।