gson 将依赖关系注入注解

s8vozzvw  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(160)

我有一个通过@JsonAdapter注解使用自定义json序列化器的类:

import com.google.gson.annotations.JsonAdapter;
@JsonAdapter(IFooAdapter.class)
public interface IFoo {
    //...
}

IFooAdapter类对应该注入的IMyFactory具有依赖关系。
通过Guice.CreateInjector()bind(IMyFactory.class).to(MyFactoryImpl.class);配置注入。
但是我如何才能让guice将它注入到我的IFooAdapter类(如下所示)中呢?这个类只在@JsonAdapter注解中使用(如上所示)。

import com.google.gson.JsonElement;
import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import com.google.inject.Inject;

public class IFooAdapter implements TypeAdapter<IFoo> {

    @Inject IMyFactory myFactory; // <-- THIS INJECTION DOES NOT WORK

    @Override public IFoo read(JsonReader in)  {
        return myFactory.create(/*...*/);
    }

    @Override public void write(JsonWriter out, IFoo value)  {
        //...
    }

}

通过guice.InjectMembers(myMainClass)注入后,当我尝试通过GsonBuilder().create().fromJson()解析json并调试IFooAdapter.read()时,myFactory为空。
(这并不奇怪,毕竟IFooAdapter不是myMainClass的成员)
但我该如何正确注射呢?

eagi6jfj

eagi6jfj1#

您可以尝试通过类似以下的方式为适配器注册InstanceCreator

gsonBuilder.registerTypeAdapter(IFooAdapter.class, type -> injector.getInstance(type))

你需要在一个地方创建Gson示例,在那里你可以访问注入器(我会像@Provides方法那样为Gson示例提供Injector参数,然后在需要的地方注入Gson)。

相关问题