Как использовать 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);
// ...
}