Кэшировать объект, только если он сериализуемый

Я включил кэширование, используя аннотацию @Cacheable для метода со следующим объявлением:

@Cacheable(value = "myCache", key = "#t+ '_' + #key", condition = "#key != null")
public <T> T get(String t, VendorProperty<T> key, T defaultValue) {
    return get(t, key).orElse(default_value);
}

Однако это выдает NotSerializableException, если объект, который он пытается кэшировать, не является сериализуемым (например: DateTimeFormatter).

Мне было интересно, можно ли кэшировать объекты только тогда, когда объект Serializable, чтобы избежать этого исключения.

Я использую memcache для кэширования объектов с помощью библиотеки simple-spring-memcache.

PS: я не могу реализовать интерфейс Serializable, так как DateTimeFormatter — это предопределенный класс.


person Akhil Prajapati    schedule 07.12.2018    source источник


Ответы (2)


Вы можете указать условие:

 condition = "#key != null && #root.target instanceof T(java.io.Serializable)"
person talex    schedule 07.12.2018
comment
Спасибо!! Я только что проверил это, и, кажется, это работает. Большое спасибо. - person Akhil Prajapati; 14.12.2018

Предложение выше не сработает. #root.target — это исполняемый целевой объект (в данном случае служебный объект). Таким образом, это будет работать, потому что объект службы не сериализуем, поэтому рассматриваемый объект не будет кэшироваться, но и ничего другого.

Вам нужно использовать условие «если», используя переменную результата:

@Cacheable(value = "myCache", 
           key = "#t+ '_' + #key", 
           condition = "#key != null"
           unless="!(#result instanceof T(java.io.Serializable))")
person Charles Hudak    schedule 16.06.2019