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

niz*_*ize 5 java static dependency-injection 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));
  }
}
Run Code Online (Sandbox Code Playgroud)

LibraryManager(将域模型请求转换为域模型响应):

public class LibraryManager {

@Inject CacheApi cache;

public static Book getBook(String isbn) {

    Book book = cache.get(isbn);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我在这里遇到的问题是我得到了

non-static variable cache cannot be referenced from a static context
Run Code Online (Sandbox Code Playgroud)

我注入缓存的方式是根据Play 2.4.2缓存API文档.我根据Play 2.2.x Cache API文档使用缓存时没有遇到此问题.该版本有一个我可以调用的静态方法.

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

Mon*_*ari 8

Guice知道的LibraryManager使用@Singleton注释,从方法去除static关键字,和他们拉高达界面:

@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);
        // ...
    }

}
Run Code Online (Sandbox Code Playgroud)

现在您可以LibraryManager通过接口注入控制器:

public class LibraryController extends Controller {

    @Inject
    private ILibraryManager libraryManager;

}
Run Code Online (Sandbox Code Playgroud)

恭喜!您以适当的方式解耦LibraryManager并集成它Play 2.4.

  • 我在这个答案中遵循了指南.除了上面的行之外,我发现我必须将`routesGenerator:= InjectedRoutesGenerator`添加到build.sbt,因为我的控制器方法实际上也有`static`关键字.此外,我添加了`import com.google.inject.ImplementedBy; @ImplementedBy(LibraryManager.class)公共接口ILibraryManager {`以配置要使用的实现. (2认同)