次のように、汎用メソッドに jackson json ライブラリを使用したいと思います。
public MyRequest<T> tester() {
TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>();
MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, typeRef);
return requestWrapper.getRequest();
}
public class MyWrapper<T> {
private MyRequest<T> request;
public MyRequest<T> getRequest() {
return request;
}
public void setRequest(MyRequest<T> request) {
this.request = request;
}
}
public class MyRequest<T> {
private List<T> myobjects;
public void setMyObjects(List<T> ets) {
this.myobjects = ets;
}
@NotNull
@JsonIgnore
public T getMyObject() {
return myobjects.get(0);
}
}
ここで問題となるのは、リクエスト オブジェクト内にある getMyObject() を呼び出すと、Jackson がネストされたカスタム オブジェクトを LinkedHashMap として返すことです。T オブジェクトを返す必要があることを指定する方法はありますか? たとえば、Customer タイプのオブジェクトを送信した場合、そのリストから Customer を返す必要がありますか?
ベストアンサー1
これは、Java の型消去に関するよく知られた問題です。T は単なる型変数であり、通常は Class 引数として実際のクラスを指定する必要があります。このような情報がない場合、最善の方法は境界を使用することです。プレーン T は、おおよそ「T は Object を拡張する」と同じです。そして、Jackson は JSON オブジェクトをマップとしてバインドします。
この場合、テスターメソッドはクラスにアクセスできる必要があり、次のように構築できます。
JavaType type = mapper.getTypeFactory().
constructCollectionType(List.class, Foo.class)
その後
List<Foo> list = mapper.readValue(new File("input.json"), type);