【问题标题】:Guice Injection into Google Cloud Endpoints Transformer将 Guice 注入到 Google Cloud Endpoints Transformer
【发布时间】:2015-06-15 09:42:07
【问题描述】:

我有一个 Google Cloud Endpoints 应用程序成功working with Guice

我希望将 Singleton 注入到 Api Transformer

假设我希望将Something转换为SomethingElse,Something声明它是转换器:

import com.google.api.server.spi.config.Transformer;
import com.google.inject.Inject;
import com.google.inject.Singleton;

@Singleton
public class MyApiTransformer
    implements Transformer<Something, SomethingElse> {

private MySingleton singleton;

@Inject
public MyApiTransformer(MySingleton singleton) {
    this.singleton = singleton;
}
@Override
public Something transformFrom(SomethingElse somethingElse) {
    return singleton.something(somethingElse);
}

@Override
public SomethingElse transformTo(Something something) {
    return singleton.somethingElse(something);
}

}

请注意,我希望将转换委托给我的 Guice 单例。当我尝试使用上述变压器时,出现以下错误:

java.io.IOException:com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException:无法实例化自定义序列化程序 MyApiTransformer,找不到构造函数:[(接口 java.lang.reflect.Type), (class java.lang.Class), ()]

Guice 似乎没有提供 ApiTransformers,所以 Jackson 不知道如何在没有默认构造函数的情况下实例化类。

Guice 如何将 Singleton 注入 ApiTransformer?

【问题讨论】:

    标签: java google-app-engine guice google-cloud-endpoints


    【解决方案1】:

    给你的 Transformer 一个默认构造函数并进行静态注入:

    import com.google.api.server.spi.config.Transformer;
    import com.google.inject.Inject;
    
    public class MyApiTransformer
        implements Transformer<Something, SomethingElse> {
    
    @Inject
    private static MySingleton singleton;
    
    public MyApiTransformer() {
    
    }
    @Override
    public Something transformFrom(SomethingElse somethingElse) {
        return singleton.something(somethingElse);
    }
    
    @Override
    public SomethingElse transformTo(Something something) {
        return singleton.somethingElse(something);
    }
    
    }
    

    在您的模块中:

    public class MyModule
        extends AbstractModule {
    
    @Override
    protected void configure() {
    
        requestStaticInjection(MyApiTransformer.class);
    }
    
    }
    

    【讨论】:

    • 为什么会选择静态注入?
    • @JanGalinski 我没有选择它,但它确实有效。我希望有更好的解决方案。
    • 使字段非静态并在转换器实例上使用“injector.injectMembers()”应该会给您相同的结果,但没有打开“静态”上下文,这可能会以意想不到的方式干扰guice 的单身人士。
    • 您建议将injectMembers 声明放在哪里?它需要成为 Cloud Endpoints 框架的一部分。 Jersey 允许我们创建适配器的自定义实例,因此我正在 Cloud Endpoints 中寻找相同的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    相关资源
    最近更新 更多