How to use the play.cache.CacheApi in a static met

2019-04-09 08:45发布

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!

2条回答
一夜七次
2楼-- · 2019-04-09 09:02

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.

查看更多
爷的心禁止访问
3楼-- · 2019-04-09 09:10

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);
    // ...
    }
查看更多
登录 后发表回答