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