Wenn Sie Jackson verwenden, um eine Zeichenfolge Ihrer konkreten Klasse zuzuordnen, insbesondere wenn Sie mit einem generischen Typ arbeiten. Dann kann dieses Problem aufgrund eines anderen Klassenladeprogramms auftreten. ich habe es einmal mit unten szenarior getroffen:
Projekt B hängt von Bibliothek A ab
in Bibliothek A:
public class DocSearchResponse<T> {
private T data;
}
Es verfügt über einen Dienst zum Abfragen von Daten aus externen Quellen und zum Konvertieren in eine konkrete Klasse mit Jackson
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>>() {});
}
}
in Projekt B:
public class Account{
private String name;
}
und ich benutze ServiceA aus der Bibliothek, um Abfragen zu machen und auch Daten zu konvertieren
public class ServiceAImpl extends ServiceA<Account> {
}
und nutzen Sie das
public class MakingAccountService {
@Autowired
private ServiceA service;
public void execute(Criteria criteria){
DocSearchResponse<Account> result = service.query(criteria);
Account acc = result.getData();
}
}
Es kommt vor, dass Jackson vom Klassenladeprogramm von LibraryA die Account-Klasse nicht laden kann und dann einfach die Methode convertJson
in Projekt B überschreibt , damit Jackson seine Arbeit erledigen kann
public class ServiceAImpl extends ServiceA<Account> {
@Override
public DocSearchResponse<T> convertJson(String result){
return mapper.readValue(result, new TypeReference<DocSearchResponse<T>>() {});
}
}
}