【问题标题】:Inject a dependency into an annotation将依赖注入注解
【发布时间】:2021-04-08 13:13:21
【问题描述】:

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

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

IFooAdapter 类依赖于应该注入的IMyFactory

通过Guice.CreateInjector()bind(IMyFactory.class).to(MyFactoryImpl.class); 配置注入。

但是我怎样才能将它注入到我的 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为Null。

(这其实并不奇怪,毕竟 IFooAdapter 不是 myMainClass 的成员)

但是我该如何正确注入呢?

【问题讨论】:

    标签: java dependency-injection annotations gson guice


    【解决方案1】:

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

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

    您需要在可以访问注入器的地方创建Gson 实例(我将使用@Provides 方法来提供Gson 实例和Injector 参数,然后在需要的地方注入Gson )。

    【讨论】:

    • 好吧,我希望我可以避免更改创建 gsonBuilder 的所有位置,但如果 @JsonAdapter 根本无法以这种方式工作,那么它就是这样。
    猜你喜欢
    • 2023-03-09
    • 2011-11-06
    • 1970-01-01
    • 2014-09-23
    • 2011-09-15
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    相关资源
    最近更新 更多