Amit Patil
Amit Patil

Reputation: 790

How to programmatically override ehcache configuration set in xml file? Or How to set CacheLoaderWriter bean to ehcache xml configuration?

I want to use read-through and write-through cache strategies using Ehcache and I am using XML configuration to configure Ehcache, I want to set spring bean (CacheLoaderWriter implementation) to cache configuration, I can't do that using XML configuration, because then Ehcache instantiate the bean using default constructor and spring DI will not work, so, How Can I override/set spring managed CacheLoaderWriter bean to cache defined in XML config file in java-config?

I tried setting CacheLoaderWriter class in my XML file as below

<cache alias="employeeEntityCache">
     <key-type>java.lang.Long</key-type>
     <value-type>com.example.spring.cahce.model.Employee</value-type>
     <loader-writer>
<class>com.example.spring.cahce.stragegy.readwritethrough.EmployeeEntityLoaderWriter</class>
      </loader-writer>
      <resources>
                <heap unit="entries">100</heap>
      </resources>
</cache>

But, then Ehcache instantiate LoaderWriter bean and hence spring DI will not work

My java config, to load cache configuration from xml

    @Bean
    @Qualifier("jcachexml")
    public javax.cache.CacheManager jCacheCacheManager() {

        CachingProvider cachingProvider = Caching.getCachingProvider();
        try {
            javax.cache.CacheManager manager = cachingProvider.getCacheManager(
                    getClass().getResource("/ehcache-jsr107-config.xml").toURI(),
                    getClass().getClassLoader());
            return manager;
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        return null;
     }

I want a way to override cache configuration set in Ehcache XML configuration, so that I can set spring managed CacheLoaderWriter bean to cache configuration and can inject dependencies using DI

Upvotes: 0

Views: 2881

Answers (1)

Amit Patil
Amit Patil

Reputation: 790

Ehcache 3.8.0 has added new feature Configuration Derivation, using which we can use to override the configurations,

refer Configuration Derivation

So, I was able to override by XML configuration in java config and also set CacheLoaderWriter as a fully initialized spring bean.

@Autowired
private EmployeeEntityLoaderWriter employeeEntityLoaderWriter;

@Bean
@Qualifier("jcachexml")
public javax.cache.CacheManager jCacheCacheManager() {
   final XmlConfiguration xmlConfiguration = new XmlConfiguration(getClass().getResource("/ehcache-jsr107-config.xml"));
    CacheConfiguration modifiedEmployeeCacheConfiguration = xmlConfiguration.getCacheConfigurations().get("employeeEntityCache");

    // override cache configuration (specific to employee cache) from xml (Set  CacheLoderWriter)
    modifiedEmployeeCacheConfiguration = modifiedEmployeeCacheConfiguration
            .derive()
            .withLoaderWriter(employeeEntityLoaderWriter).build();

    // get updated configuration (at CacheManager level)
    org.ehcache.config.Configuration modifiedConfiguration = xmlConfiguration
            .derive()
            .withCache("employeeEntityCache", modifiedEmployeeCacheConfiguration)
            .build();

    // get CacheManager (Jcache) with above updated configuration
    final EhcacheCachingProvider ehcacheCachingProvider = (EhcacheCachingProvider) Caching.getCachingProvider();
    final javax.cache.CacheManager manager = ehcacheCachingProvider.getCacheManager(ehcacheCachingProvider.getDefaultURI(), modifiedConfiguration);

    return manager;
}

Upvotes: 0

Related Questions