jackson을 사용하여 문자열에서 구체적인 클래스로 매핑하는 경우, 특히 일반 유형으로 작업하는 경우. 이 문제는 다른 클래스 로더로 인해 발생할 수 있습니다. 나는 아래 시나리오와 함께 한 번 만났습니다.
프로젝트 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의 클래스 로더에서 jackson이 Account 클래스를로드 할 수없고 convertJson
jackson이 작업을 수행하도록 프로젝트 B의 메서드 를 재정의하기 때문에 발생합니다.
public class ServiceAImpl extends ServiceA<Account> {
@Override
public DocSearchResponse<T> convertJson(String result){
return mapper.readValue(result, new TypeReference<DocSearchResponse<T>>() {});
}
}
}