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

2024-02-10

我有一个 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 缓存API文档 https://www.playframework.com/documentation/2.4.x/JavaCache。当我按照以下方式使用缓存时没有遇到这个问题Play 2.2.x 缓存 API 文档 https://www.playframework.com/documentation/2.2.x/JavaCache。该版本有一个我可以调用的静态方法。

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


Make Guice意识到LibraryManager using @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);
        // ...
    }

}

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

public class LibraryController extends Controller {

    @Inject
    private ILibraryManager libraryManager;

}

恭喜!你解耦了LibraryManager并将其与Play 2.4以适当的方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐