ジャクソンを使用して文字列から具象クラスにマップする場合、特にジェネリック型を使用する場合。この問題は、クラスローダーが異なるために発生する可能性があります。私は以下のシナリオで一度会った:
プロジェクト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
、プロジェクトBのメソッドをオーバーライドして、jacksonにジョブを実行させるために発生します。
public class ServiceAImpl extends ServiceA<Account> {
@Override
public DocSearchResponse<T> convertJson(String result){
return mapper.readValue(result, new TypeReference<DocSearchResponse<T>>() {});
}
}
}