How to avoid caching when values are null?

Just throw some Exception if user is not found and catch it in client code while using get(key) method.

new CacheLoader<ObjectId, User>() {
    @Override
    public User load(ObjectId k) throws Exception {
        User u = DataLoader.datastore.find(User.class).field("_id").equal(k).get();
        if (u != null) {
             return u;
        } else {
             throw new UserNotFoundException();
        }
    }
}

From CacheLoader.load(K) Javadoc:

Returns:  
  the value associated with key; must not be null  
Throws:  
  Exception - if unable to load the result

Answering your doubts about caching null values:

Returns the value associated with key in this cache, first loading
that value if necessary. No observable state associated with this
cache is modified until loading completes
.

(from LoadingCache.get(K) Javadoc)

If you throw an exception, load is not considered as complete, so no new value is cached.

EDIT:

Note that in Caffeine, which is sort of Guava cache 2.0 and “provides an in-memory cache using a Google Guava inspired API” you can return null from load method:

 Returns:
   the value associated with key or null if not found

If you may consider migrating, your data loader could freely return when user is not found.

Leave a Comment