1

私はプレーフレームワークアプリケーションを持っています。私は静的メソッドを介してキャッシュにアクセスしようとしています。私はシングルトンにキャッシュをラップすることに決めましたが、CacheSingletonクラスのキャッシュ変数にアクセスしようとするとNullPointerExceptionが発生します。どのように問題を解決することができますか?ありがとう。Play Framework CacheApi注入はシングルレーンでNullPointeerExceptionを返します

import javax.inject.*; 
import play.cache.*; 

@Singleton 
public final class CacheSingleton { 
    @Inject CacheApi cache; 
    private static volatile CacheSingleton instance = null; 


    private CacheSingleton() { 
    } 

    public static CacheSingleton getInstance() { 
     if (instance == null) { 
      synchronized(CacheSingleton.class) { 
       if (instance == null) { 
        instance = new CacheSingleton(); 
       } 
      } 
     } 
     return instance; 
    } 
} 

public class CustomLabels { 
    public static String get() { 
     CacheSingleton tmp = CacheSingleton.getInstance(); 
     try 
     { 
      tmp.cache.set("key", "value"); 
     }catch(Exception e){} 
    } 
} 

答えて

0

スタティックインジェクションを使用しないでください。 DIとGuiceのため https://stackoverflow.com/a/22068572/1118419

プレイ用のGuiceは静的注入を行うことができますが、この能力は強く推奨されていません:

それは "一般的に" ことはできません

https://github.com/google/guice/wiki/Injections#static-injections

正しい方法:use CacheApi in Play

import play.cache.*; 
import play.mvc.*; 

import javax.inject.Inject; 

public class Application extends Controller { 

    private CacheApi cache; 

    @Inject 
    public Application(CacheApi cache) { 
     this.cache = cache; 
    } 

    // ... 
} 
関連する問題