我有一个play framework应用程序,我已经迁移到在play Framework2.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我注入缓存的方式与播放2.4.2缓存API文档相同。当我按照播放2.2.x缓存API文档使用缓存时,没有这个问题。那个版本有一个我可以调用的静态方法。
我该怎么办?我应该让getBook非静态应用一些单例模式吗?还是应该以其他方式访问缓存?示例代码肯定会有帮助!
发布于 2015-08-05 14:13:39
让Guice知道使用@Singleton注释的LibraryManager,从方法中删除静态关键字并将它们拉到接口上:
@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集成。
发布于 2017-03-23 15:17:11
获取静态功能中的CacheApi.class实例。
public class LibraryManager {
public static Book getBook(String isbn) {
CacheApi cache = Play.current().injector().instanceOf(CacheApi.class);
Book book = cache.get(isbn);
// ...
}https://stackoverflow.com/questions/31833970
复制相似问题