Как использовать play.cache.CacheApi в статическом методе в Play! Framework 2.4.2

У меня есть приложение Play Framework, которое я перенес для запуска на Play Framework 2.4.2. Он предоставляет RESTful API для веб-интерфейса javascript/html. Теперь у меня есть некоторые проблемы с введением кеширования.

LibraryController (преобразование JSON/HTTP-запроса в JSON/HTTP-ответ):

public class LibraryController extends Controller {

  public Result getBook(String isbn) {
      Book book = LibraryManager.getBook(isbn);
      BookDto bookDto = DtoMapper.book2BookDtos(book);
      return ok(Json.toJson(bookDto));
  }
}

LibraryManager (преобразование запроса модели домена в ответ модели домена):

public class LibraryManager {

@Inject CacheApi cache;

public static Book getBook(String isbn) {

    Book book = cache.get(isbn);
    // ...
}

У меня проблема в том, что я получаю

non-static variable cache cannot be referenced from a static context

Способ ввода кеша - согласно документации Play 2.4.2 Cache API. У меня не было этой проблемы, когда я использовал кэширование согласно документации API Play 2.2.x Cache. В этой версии был статический метод, который я мог вызвать.

Что я должен делать? Должен ли я сделать getBook нестатичным, применяя какой-то одноэлементный шаблон? Или я должен получить доступ к кешу другим способом? Пример кода наверняка поможет!

2 ответа

Решение

Делать Guice знать о LibraryManager с помощью @Singleton аннотации, удалите статическое ключевое слово из методов и перенесите их в интерфейс:

@ImplementedBy(LibraryManager.class)
public interface ILibraryManager {
    //
}

@Singleton
public class LibraryManager implements ILibraryManager {

    @Inject
    private CacheApi cache;

    @Override
    public Book getBook(String isbn) {
        Book book = cache.get(isbn);
        // ...
    }

}

Теперь вы можете вводить LibraryManager интерфейсом к вашему контроллеру:

public class LibraryController extends Controller {

    @Inject
    private ILibraryManager libraryManager;

}

Поздравляем! Вы отделены LibraryManager и интегрировал его с Play 2.4 в надлежащем порядке.

Получить экземпляр CacheApi.class внутри статического поиска.

    public class LibraryManager {

    public static Book getBook(String isbn) {
      CacheApi cache = Play.current().injector().instanceOf(CacheApi.class);
      Book book = cache.get(isbn);
    // ...
    }
Другие вопросы по тегам