Когда вы используете Джексона для сопоставления строки с конкретным классом, особенно если вы работаете с универсальным типом. тогда эта проблема может возникнуть из-за другого загрузчика классов. Я встретил это однажды со сценарием ниже:
Проект B зависит от библиотеки A
в библиотеке A:
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>>() {});
}
}
в Проекте Б:
public class Account{
private String name;
}
и я использую ServiceA из библиотеки, чтобы делать запросы, а также конвертировать данные
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();
}
}
это происходит потому, что из загрузчика классов LibraryA, Джексон не может загрузить класс Account, а затем просто переопределить метод convertJson
в Project B, чтобы позволить Джексону выполнять свою работу
public class ServiceAImpl extends ServiceA<Account> {
@Override
public DocSearchResponse<T> convertJson(String result){
return mapper.readValue(result, new TypeReference<DocSearchResponse<T>>() {});
}
}
}