1

У меня есть приложение для фреймворка. Я пытаюсь получить доступ к кешу через статический метод. Я решил обернуть кеш в singleton, но я получаю NullPointerException, когда пытаюсь получить доступ к переменной кэша в классе CacheSingleton. Как проблема может быть решена? Благодарю.Play Framework CacheApi injection return NullPointeerException в singleletone

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

Не используйте статические инъекции.

Это не возможно "в целом": https://stackoverflow.com/a/22068572/1118419

Play использовать Guice для DI и 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; 
    } 

    // ... 
} 
Смежные вопросы