Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use the play.cache.CacheApi in a static method in Play! Framework 2.4.2

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!

like image 978
nize Avatar asked Aug 05 '15 13:08

nize


2 Answers

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.

like image 85
Mon Calamari Avatar answered Nov 02 '22 10:11

Mon Calamari


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);
    // ...
    }
like image 20
MANINDER SINGH Avatar answered Nov 02 '22 09:11

MANINDER SINGH