2015-06-15 32 views
0

我有一个Google云终端应用程序成功working with GuiceGuice注入Google云终端变形器

我希望将一个单例注入一个Api Transformer

比方说,我想转换成东西SomethingElse,那里的东西宣称它的变压器是:

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); 
} 

} 

请注意,我想委托转型,我吉斯单。当我尝试上述变压器我得到以下错误:

java.io.IOException: com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException: Failed to instantiate custom serializer MyApiTransformer, constructors not found: [(interface java.lang.reflect.Type), (class java.lang.Class),()]

看来,吉斯不提供ApiTransformers所以杰克逊不知道如何实例化类没有默认构造函数。

Guice如何将Singleton注入ApiTransformer?

回答

0

给你的变压器默认的构造函数,做静态注入:

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); 
} 

} 
+0

你为什么会选择静态注射? –

+0

@JanGalinski我没有选择它,但它确实有效。我希望有更好的解决方案。 –

+0

使字段非静态并在变量实例上使用“injector.injectMembers()”应该会给出相同的结果,但不会打开“静态”上下文,这可能会以意外的方式干扰guice的单例。 –