Кэшировать объект, только если он 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))")