I have a play framework application which I have migrated to run on play framework 2.4.2. It is providing a RESTful API to a javascript/html frontend. Now I have some problems introducing caching.
LibraryController (transforming JSON/HTTP request to JSON/HTTP response):
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 (transforming domain model request to domain model response):
public class LibraryManager {
@Inject CacheApi cache;
public static Book getBook(String isbn) {
Book book = cache.get(isbn);
// ...
}
The problem I have here is that I get
non-static variable cache cannot be referenced from a static context
The way I am injecting the cache is as per Play 2.4.2 Cache API documentation. I didn't have this problem when I used caching as per the Play 2.2.x Cache API documentation. That version had a static method I could call.
What should I do? Should I make getBook non-static applying some singleton pattern? Or should I access the cache in some other way? Sample code would surely help out!
Make Guice
aware of LibraryManager
using @Singleton
annotation, remove static keyword from methods and pull them up to 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);
// ...
}
}
Now you can inject LibraryManager
by an interface to your controller:
public class LibraryController extends Controller {
@Inject
private ILibraryManager libraryManager;
}
Congratulations! You decoupled LibraryManager
and integrated it with Play 2.4
in proper way.
Get instance of CacheApi.class inside static finction.
public class LibraryManager {
public static Book getBook(String isbn) {
CacheApi cache = Play.current().injector().instanceOf(CacheApi.class);
Book book = cache.get(isbn);
// ...
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With