如何在Play中的静态方法中使用play.cache.CacheApi!框架2.4.2

时间:2015-08-05 13:29:09

标签: java dependency-injection static playframework-2.0

我有一个play框架应用程序,我已经迁移到play框架2.4.2上运行。它为javascript / html前端提供RESTful API。现在我在引入缓存方面遇到了一些问题。

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 documentation。当我根据Play 2.2.x Cache API documentation使用缓存时,我没有遇到此问题。该版本有一个我可以调用的静态方法。

我该怎么办?我应该使getBook非静态应用一些单例模式吗?或者我应该以其他方式访问缓存?示例代码肯定会有所帮助!

2 个答案:

答案 0 :(得分:8)

使用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集成。

答案 1 :(得分:1)

在静态结尾中获取CacheApi.class的实例。

    public class LibraryManager {

    public static Book getBook(String isbn) {
      CacheApi cache = Play.current().injector().instanceOf(CacheApi.class);
      Book book = cache.get(isbn);
    // ...
    }