Khi bạn sử dụng jackson để ánh xạ từ chuỗi sang lớp cụ thể của mình, đặc biệt nếu bạn làm việc với kiểu chung. thì sự cố này có thể xảy ra do trình tải lớp khác nhau. tôi đã gặp nó một lần với kịch bản dưới đây:
Dự án B phụ thuộc vào Thư viện A
trong Thư viện A:
public class DocSearchResponse<T> {
private T data;
}
nó có dịch vụ truy vấn dữ liệu từ nguồn bên ngoài và sử dụng jackson để chuyển đổi sang lớp cụ thể
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>>() {});
}
}
trong Dự án B:
public class Account{
private String name;
}
và tôi sử dụng ServiceA từ thư viện để thực hiện truy vấn và cũng như chuyển đổi dữ liệu
public class ServiceAImpl extends ServiceA<Account> {
}
và tận dụng nó
public class MakingAccountService {
@Autowired
private ServiceA service;
public void execute(Criteria criteria){
DocSearchResponse<Account> result = service.query(criteria);
Account acc = result.getData();
}
}
nó xảy ra bởi vì từ trình tải lớp của LibraryA, jackson không thể tải lớp Tài khoản, khi đó chỉ cần ghi đè phương thức convertJson
trong Dự án B để jackson thực hiện công việc của nó
public class ServiceAImpl extends ServiceA<Account> {
@Override
public DocSearchResponse<T> convertJson(String result){
return mapper.readValue(result, new TypeReference<DocSearchResponse<T>>() {});
}
}
}