Кэшировать объект, только если он Serializable

Я включил кэширование с помощью @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 если объект, который он пытается кэшировать, не Serializable (например: DateTimeFormatter).

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

я использую memcache кешировать объекты используя simple-spring-memcache библиотека.

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

1 ответ

Решение

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

 condition = "#key != null && #root.target instanceof T(java.io.Serializable)"

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

Вам необходимо использовать условие "разве", используя переменную результата:

@Cacheable(value = "myCache", 
           key = "#t+ '_' + #key", 
           condition = "#key != null"
           unless="!(#result instanceof T(java.io.Serializable))")
Другие вопросы по тегам