Кэшировать объект, только если он Serializable - PullRequest
0 голосов
/ 07 декабря 2018

Я включил кэширование с помощью аннотации @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).

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

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

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

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

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

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

@Cacheable(value = "myCache", 
           key = "#t+ '_' + #key", 
           condition = "#key != null"
           unless="!(#result instanceof T(java.io.Serializable))")
0 голосов
/ 07 декабря 2018

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

 condition = "#key != null && #root.target instanceof T(java.io.Serializable)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...