2015-06-15 30 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的單例。 –