2017-02-20 27 views
1

У меня есть хранилище данных Spring Data Rest, которое я бы хотел использовать с Spring Caching.Весенний кэш с хранилищем данных Spring Data хранит результаты кэширования с исключением по исключению

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

SDR Repository

@RepositoryRestResource(collectionResourceRel = "businessUnits", path = "businessUnits") 
public interface BusinessUnitRepository extends JpaRepository<BusinessUnit, UUID> { 

@Override 
@Cacheable(value = "lookups", cacheManager = "vaultCache") 
BusinessUnit findOne(final UUID id); 

@Override 
@CacheEvict(value = "lookups", cacheManager = "vaultCache", allEntries = true, beforeInvocation = true) 
BusinessUnit save(BusinessUnit entity); 

Если я POST тело сообщения ниже новой бизнес-единицы она сохраняется правильно. Первый GET для извлечения записи попадает в базу данных, как ожидалось, и последующие GET поступают из кеша.

{ 
"name": "Test_Business_2", 
"effectiveDate": "2019-12-16T11:11:11.111+0000", 
"expirationDate": "2020-12-16T11:11:11.111+0000", 
"businessUnitType": "/businessUnitTypes/38faf33c-5454-4245-bc69-2b31e510fa6b" 
} 

Объект BusinessUnit имеет значение null в поле effectiveDate.

@NotNull 
@Column(name = "effective_date") 
private Timestamp effectiveDate; 

Когда я PATCH бизнес-единицы с нулевой эффективностью. Ответ - ошибка, исключение регистрируется и база данных не обновляется.

{ 
"effectiveDate": null 
} 

Когда я запроса дб, я вижу, что запись не была обновлена ​​

NAME   EFFECTIVE_DATE  EXPIRATION_DATE 
Test_Business_2,2019-12-16 06:11:11,2020-12-16 06:11:11 

Однако, когда я делаю GET на конечной точке businessUnits. База данных не попадает, чтобы прочитать запись, и возвращается null effectiveDate.

{ 
"createDate": "2017-02-20T13:38:00.386+0000", 
"lastModifiedDate": "2017-02-20T13:38:00.386+0000", 
"effectiveDate": null, 
"expirationDate": "2020-12-16T11:11:11.111+0000", 
"name": "Test_Business_2", ... 

Таким образом, похоже, что данные, вызвавшие выброс исключения, хранятся в кеше.

Что нужно изменить, чтобы значение не сохранялось в кеше, когда база данных не обновляется при сохранении?

Я ценю любую помощь или совет. Благодарю.

+0

Я не нашел решение моей проблемы, но я нашел работу. В случае, когда я вижу ошибку, генерируется исключение, но кеш не выдается. В методе, который обрабатывает исключение, я могу программно очистить кеш. Кэш-кеш = cacheManager.getCache ("lookups"); cache.clear(); Затем кеш очищается и не содержит значения «исключения». –

ответ

1

key Вы кеш и key вы выселения не совпадают. Вам нужно определить, как получить идентификатор из BusinessUnit, например:

@CacheEvict(key = "#entity.id" 

Или предоставить KeyGenerator, который понимает вашу модель домена.

+0

Я получаю тот же результат независимо от параметра beforeInvocation. Я попробовал установить значение true и false. –

+0

Извините, я неправильно прочитал ваши аннотации – OrangeDog

+0

@EricSmith обновлен – OrangeDog

 Смежные вопросы

  • Нет связанных вопросов^_^