тип ключа и тип значения существующего Jcache

Есть ли способ получить определение базового ключа и типа значения кеша, созданного каким-то другим кодом? На данный момент я знаю только имя кеша. Другой информации о том, как был создан кеш, у меня нет. Кэш здесь Jcache.

javax.cache.Cache cache = cachingService.getCache(cacheName);

Здесь он приведен к объекту, объекту. Но я хочу знать фактический тип ключа и тип значения.


person Pramod Kishore    schedule 15.12.2017    source источник


Ответы (1)


Когда у вас есть доступный Cache, вы можете узнать типы ключей/значений, с которыми он был настроен, проверив его Configuration:

// assuming you already have a Cache object available:
javax.cache.configuration.Configuration cacheConfig = cache.getConfiguration(Configuration.class);
Class keyType = cacheConfig.getKeyType();
Class valueType = cacheConfig.getValueType();

Теперь, чтобы получить сам Cache при использовании JCache 1.0, если вы не знаете о его настроенных параметрах типов ключей/значений, единственным вариантом является использование cacheManager.getCache(name). Однако, в соответствии с JCache 1.0, это будет работать только в том случае, если Cache не был сконфигурирован с какими-либо конкретными типами (т. е. Object.class является типом ключа и значения), в противном случае произойдет сбой с IllegalArgumentException (см. [1]). По сути, вы попали в порочный круг.

Это поведение было обновлено в JCache 1.1 (см. соответствующую проблему в [2]): теперь спецификация cacheManager.getCache(name) ослаблена и может возвращать Cache, если она существует с заданным именем, независимо от настроенных типов ключ/значение. Единственная загвоздка сейчас в том, что JCache 1.1 был выпущен всего пару дней назад (16 декабря 2017 г., см. [3]), поэтому, скорее всего, реализации еще не обновлены, чтобы разрешить такое поведение.

[1] https://github.com/jsr107/jsr107spec/blob/v1.0.0/src/main/java/javax/cache/CacheManager.java#L200-L201

[2] https://github.com/jsr107/jsr107spec/issues/340#issuecomment-254070714

[3] http://search.maven.org/#artifactdetails%7Cjavax.cache%7Ccache-api%7C1.1.0%7Cjar

person Vassilis Bekiaris    schedule 18.12.2017