Jacksonとジェネリック型参照 質問する

Jacksonとジェネリック型参照 質問する

次のように、汎用メソッドに 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);

おすすめ記事