当您使用杰克逊将字符串从映射到具体类时,尤其是在使用泛型类型时。那么可能由于不同的类加载器而发生此问题。我在下面的场景中遇到了一次:
项目B取决于图书馆A
在库A中:
public class DocSearchResponse<T> {
private T data;
}
它具有从外部源查询数据的服务,并使用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>>() {});
}
}
在项目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的类加载器中加载帐户类,而是仅重写convertJson
项目B中的方法以让杰克逊完成其工作
public class ServiceAImpl extends ServiceA<Account> {
@Override
public DocSearchResponse<T> convertJson(String result){
return mapper.readValue(result, new TypeReference<DocSearchResponse<T>>() {});
}
}
}