作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 play 框架应用程序,我已经迁移到 play framework 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
我注入(inject)缓存的方式是按照Play 2.4.2 Cache API documentation .当我按照 Play 2.2.x Cache API documentation 使用缓存时,我没有遇到这个问题.那个版本有一个我可以调用的静态方法。
我该怎么办?我应该让 getBook 非静态应用一些单例模式吗?或者我应该以其他方式访问缓存吗?示例代码肯定会有所帮助!
最佳答案
使用 @Singleton
注释让 Guice
知道 LibraryManager
,从方法中删除 static 关键字并将它们拉到接口(interface):
@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);
// ...
}
}
现在您可以通过 Controller 接口(interface)注入(inject) LibraryManager
:
public class LibraryController extends Controller {
@Inject
private ILibraryManager libraryManager;
}
恭喜!您解耦了 LibraryManager
并以适当的方式将其与 Play 2.4
集成。
关于java - 如何在 Play! 的静态方法中使用 play.cache.CacheApi框架 2.4.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31833970/
我是一名优秀的程序员,十分优秀!