1. ホーム
  2. spring

SpringキャッシュにNULL値をキャッシュしないように@Cacheableアノテーションを指定する方法

2023-09-11 19:21:09

質問

このようなメソッドの@Cacheableアノテーションで、メソッドがNULL値を返した場合、その結果をキャッシュしないように指定する方法はありますか?

@Cacheable(value="defaultCache", key="#pk")
public Person findPerson(int pk) {
   return getSession.getPerson(pk);
}

更新しました。 は、昨年 11 月に提出された null 値のキャッシュに関する JIRA issue で、これはまだ解決されていません。 [#SPR-8871] @Cachable condition は戻り値を参照できるようにすべき - Spring Projects Issue Tracker

どのように解決するのですか?

なんと、Spring 3.2からはフレームワークでSpring SPELを使用して、このようなことが可能になりました。 unless . Cacheableを取り巻くjavaドキュメントからのメモです。

http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/cache/annotation/Cacheable.html

<ブロッククオート

public abstract String unless

Spring Expression Language (SpEL)の属性で、メソッドキャッシュを拒否するために使用されます。

condition()とは異なり、この式はメソッドが呼び出された後に評価されるため、結果を参照することができます。デフォルトは""で、キャッシュが拒否されないことを意味します。

重要な点は unless はメソッドが呼び出された後に評価されることです。キーがすでにキャッシュにある場合、メソッドは決して実行されないので、これは完全に理にかなっています。

したがって、上記の例では、単に次のようにアノテーションします(#resultはメソッドの戻り値をテストするために利用できます)。

@Cacheable(value="defaultCache", key="#pk", unless="#result == null")
public Person findPerson(int pk) {
   return getSession.getPerson(pk);
}

私は、この条件は、NULLのキャッシュを可能にするEhcacheのようなプラグインキャッシュの実装を使用することから発生すると想像しています。あなたのユースケースのシナリオによって、これは望ましいかもしれませんし、望ましくないかもしれません。