Kiedy używasz jacksona do mapowania z ciągu znaków na konkretną klasę, zwłaszcza jeśli pracujesz z typem ogólnym. wtedy ten problem może wystąpić z powodu innego programu ładującego klasy. spotkałem to kiedyś z poniższym scenariuszem:
Projekt B zależy od Biblioteki A
w bibliotece A:
public class DocSearchResponse<T> {
private T data;
}
ma usługę do przeszukiwania danych z zewnętrznego źródła i używa jsona do konwersji na konkretną klasę
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>>() {});
}
}
w Projekcie B:
public class Account{
private String name;
}
i używam ServiceA z biblioteki do tworzenia zapytań i konwersji danych
public class ServiceAImpl extends ServiceA<Account> {
}
i wykorzystaj to
public class MakingAccountService {
@Autowired
private ServiceA service;
public void execute(Criteria criteria){
DocSearchResponse<Account> result = service.query(criteria);
Account acc = result.getData();
}
}
dzieje się tak, ponieważ z modułu ładującego klasy biblioteki A, jackson nie może załadować klasy konta, a następnie po prostu nadpisuje metodę convertJson
w projekcie B, aby pozwolić jacksonowi wykonać swoją pracę
public class ServiceAImpl extends ServiceA<Account> {
@Override
public DocSearchResponse<T> convertJson(String result){
return mapper.readValue(result, new TypeReference<DocSearchResponse<T>>() {});
}
}
}