जब आप जैकसन का उपयोग स्ट्रिंग से अपने ठोस वर्ग तक के नक्शे में करते हैं, खासकर यदि आप सामान्य प्रकार के साथ काम करते हैं। तब अलग-अलग श्रेणी लोडर के कारण यह समस्या हो सकती है। मैं इसे एक समय में नीचे के साथ मिले:
प्रोजेक्ट बी लाइब्रेरी ए पर निर्भर करता है
लाइब्रेरी ए में:
public class DocSearchResponse<T> {
private T data;
}
इसमें बाहरी स्रोत से डेटा क्वेरी करने और ठोस वर्ग में बदलने के लिए जैक्सन का उपयोग करने की सेवा है
public class ServiceA<T>{
@Autowired
private ObjectMapper mapper;
@Autowired
private ClientDocSearch searchClient;
public DocSearchResponse<T> query(Criteria criteria){
String resultInString = searchClient.search(criteria);
return convertJson(resultInString)
}
}
public DocSearchResponse<T> convertJson(String result){
return mapper.readValue(result, new TypeReference<DocSearchResponse<T>>() {});
}
}
प्रोजेक्ट B में:
public class Account{
private String name;
}
और मैं क्वेरी बनाने के लिए और साथ ही डेटा परिवर्तित करने के लिए लाइब्रेरी से सेवा का उपयोग करता हूं
public class ServiceAImpl extends ServiceA<Account> {
}
और उस का उपयोग करें
public class MakingAccountService {
@Autowired
private ServiceA service;
public void execute(Criteria criteria){
DocSearchResponse<Account> result = service.query(criteria);
Account acc = result.getData();
}
}
ऐसा इसलिए होता है क्योंकि लाइब्रेरीए के क्लास लोडर से, जैकसन अकाउंट क्लास को लोड नहीं कर सकते हैं, तो जैकसन convertJson
को नौकरी देने के लिए प्रोजेक्ट बी में सिर्फ विधि को ओवरराइड करें
public class ServiceAImpl extends ServiceA<Account> {
@Override
public DocSearchResponse<T> convertJson(String result){
return mapper.readValue(result, new TypeReference<DocSearchResponse<T>>() {});
}
}
}