2014-09-02 98 views
1

我有這樣的基於Java的JPA配置我的春天項目:如何在基於spring的java配置中設置ehcache.xml的位置?

@Configuration 
@EnableJpaRepositories(basePackageClasses = {PackageMarker.class}) 
@EnableTransactionManagement(proxyTargetClass = true) 
@EnableCaching 
public class FooJPAConfig implements CachingConfigurer { 

    @Bean 
    @Override 
    public CacheManager cacheManager() { 
     SimpleCacheManager cacheManager = new SimpleCacheManager(); 
     cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache("default"))); 
     return cacheManager; 
    } 

    @Bean 
    @Override 
    public KeyGenerator keyGenerator() { 
     return new DefaultKeyGenerator(); 
    } 

    //... 

} 

我怎樣才能知道春天要使用特定ehcache.xml文件?

回答

1

您需要修改cacheManager以整合EhCache。您當前的代碼不會讓EhCache進入圖片。

的配置看起來像

@Configuration 
@EnableJpaRepositories(basePackageClasses = {PackageMarker.class}) 
@EnableTransactionManagement(proxyTargetClass = true) 
@EnableCaching 
public class FooJPAConfig implements CachingConfigurer { 

    @Bean 
    public EhCacheManagerFactoryBean cacheFactoryBean() { 
     EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean(); 
     ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("whatever-name.xml")); //this is where you set the location of the eh-cache configuration file 
     return ehCacheManagerFactoryBean; 
    } 

    @Bean 
    @Override 
    public CacheManager cacheManager() { 
     EhCacheCacheManager cacheManager = new EhCacheCacheManager(); 
     cacheManager.setCacheManager(cacheFactoryBean().getObject()); 
     return cacheManager; 
    } 

    @Bean 
    @Override 
    public KeyGenerator keyGenerator() { 
     return new DefaultKeyGenerator(); 
    } 

} 

您還必須有spring-context-support作爲您的類路徑依賴(適用於春季3.2)

注意,上面的代碼激活春天-EhCache整合,不是JPA - EhCache集成。這意味着你可以在實體上使用Spring的@Cacheable而不是EhCache的@Cache

+0

不能得到這個工作。你最後的筆記是什麼意思?我與Sprint 3.2.9沒有'EhCacheManagerFactoryBean'類。 – BetaRide 2014-09-02 12:58:53

+0

@BetaRide查看我的更新回答 – geoand 2014-09-02 13:02:41

+0

感謝您抽出時間。不幸的是,增加'spring-context-support'不會有幫助。我找不到'EhCacheManagerFactoryBean'。 – BetaRide 2014-09-02 14:32:56

0

畢竟我可以通過將此代碼添加到配置類解決的問題:

protected static final String EHCACHE_CONFIGURATIONRESOURCENAME_PROPERTY = "net.sf.ehcache.configurationResourceName"; 

@Bean(name = BEAN_ENTITY_MANAGER_FACTORY) 
public EntityManagerFactory entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean em = createLocalContainerEntityManagerFactoryBean(); 

    // ... 

    processOptionalProperty(EHCACHE_CONFIGURATIONRESOURCENAME_PROPERTY, em); 
    return em.getObject(); 
} 

protected void processOptionalProperty(String propertyName, LocalContainerEntityManagerFactoryBean em) { 
    String value = "";// read propertyName from configuration file 
    setPropertyValue(propertyName, em, value); 
} 

protected void setPropertyValue(String propertyName, LocalContainerEntityManagerFactoryBean em, Object value) { 
    if (value != null) { 
     Map<String, Object> jpaPropertyMap = em.getJpaPropertyMap(); 
     jpaPropertyMap.put(propertyName, value); 
     em.setJpaPropertyMap(jpaPropertyMap); 
    } 
} 
相關問題