有没有哪位大神遇到过在spring boot下集成redis后,再集成shiro后,redis使用的@Cacheable注解不起作用了

远行者 2015-11-03 04:37:39
各位大神好:
咨询一个关于spring boot 的问题,这段时间本人在做spring boot的集成,在集成redis后,使用@Cacheable缓存注解都没有问题,但是就是在集成完成shiro后,@Cacheable就不起作用了,本人怀疑是因为shiro中ehcache和redis的配置的原因,还希望各位大神指导下。代码附上:
application中相关配置:

@SpringBootApplication
@EnableTransactionManagement
@EnableJms
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
@Autowired
private DataSourceProperties dataProperties;
@Bean(destroyMethod="close")
@Primary
public DataSource dataSource(){
DataSource dataSource=new DataSource();
dataSource.setDriverClassName(this.dataProperties.getDriverClassName());
dataSource.setUrl(this.dataProperties.getUrl());
dataSource.setUsername(this.dataProperties.getUsername());
dataSource.setPassword(this.dataProperties.getPassword());
dataSource.setMaxActive(this.dataProperties.getMaxActive());
dataSource.setMaxIdle(this.dataProperties.getMaxIdle());
dataSource.setMinIdle(this.dataProperties.getMinIdle());
dataSource.setDefaultAutoCommit(this.dataProperties.isDefaultAutoCommit());
return dataSource;
}
/**
* 统一处理编码问题
* @return
*/
@Bean
public FilterRegistrationBean encodingFilter(){
CharacterEncodingFilter filter= new CharacterEncodingFilter();
FilterRegistrationBean registrationBean=new FilterRegistrationBean();
registrationBean.setFilter(filter);
registrationBean.addInitParameter("encoding","UTF-8");
registrationBean.addInitParameter("forceEncoding", "true");
registrationBean.setName("encodingFilter");
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
/**
* shiro filter
* @return
*/
@Bean
public FilterRegistrationBean delegatingFilterProxy(){
DelegatingFilterProxy proxy=new DelegatingFilterProxy();
proxy.setTargetFilterLifecycle(true);
FilterRegistrationBean registrationBean=new FilterRegistrationBean();
registrationBean.setFilter(proxy);
registrationBean.setName("shiroFilter");
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}


redis配置:

@Configuration()
@EnableCaching
public class RedisConfig extends BaseLogger {

@Autowired
private RedisConnectionFactory redisConnectionFactory;

@Bean
@SuppressWarnings({ "rawtypes", "unchecked" })
public RedisTemplate redisTemplate() {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}

@Bean(name="cacheManager")
public RedisCacheManager redisCacheManager() {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate());
return cacheManager;
}
}

配置文件:

# redis 配置
# REDIS (RedisProperties)
# database name
#spring.redis.database=
# server host
spring.redis.host=192.168.6.36
# server password
#spring.redis.password=
# connection port
spring.redis.port=6379
# pool settings ...
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
# name of Redis server
#spring.redis.sentinel.master=
# comma-separated list of host:port pairs
#spring.redis.sentinel.nodes=


shiro配置:

@Configuration
public class ShiroConfig {

private static Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();

@Bean(name = "shiroDbRealm")
public ShiroDbRealm getShiroRealm() {
return new ShiroDbRealm();
}

/**
* 缓存配置
* @return
*/
@Bean(name = "shiroEhcacheManager")
public EhCacheManager getEhCacheManager() {
EhCacheManager em = new EhCacheManager();
em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
return em;
}
@Bean
public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager() {
DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
dwsm.setRealm(getShiroRealm());
dwsm.setCacheManager(getEhCacheManager());
return dwsm;
}
@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean getShiroFilterFactoryBean() {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// shiroFilterFactoryBean
// .setSecurityManager(getDefaultWebSecurityManager());
shiroFilterFactoryBean.setLoginUrl("/login");
shiroFilterFactoryBean.setSuccessUrl("/");
filterChainDefinitionMap.put("/login","authc");
filterChainDefinitionMap.put("/static/**","anon");
filterChainDefinitionMap.put("/**", "roles[admin]");
shiroFilterFactoryBean
.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
}


在shiro配置中将以下代码屏蔽掉,@Cacheable就会起作用。

// shiroFilterFactoryBean
// .setSecurityManager(getDefaultWebSecurityManager());

...全文
2083 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_39475056 2017-08-11
  • 打赏
  • 举报
回复
楼主你好,我也遇到相同的问题,方便指导下吗?
adonis201 2017-05-10
  • 打赏
  • 举报
回复
解决了,shiro 相关的bean 中依赖 业务 bean 都要使用@Lazy
adonis201 2017-05-10
  • 打赏
  • 举报
回复
遇到同样的问题,楼主提供的解决方案 不行,什么原因?
q394049428 2016-12-15
  • 打赏
  • 举报
回复
这个已经解决了,原因就是shiro初始化的早,里面用到的bean都会在cache初始化之前被初始化,需要为shiro使用到的bean加@Lazy
@Autowired
    @Lazy
	private UserService userService;
sylrain 2016-07-21
  • 打赏
  • 举报
回复
lz解决了么 我试过redis和ehcache 只要有ehcahe配置 cacheable会默认使用ehcache
chaoxiaobudian 2016-06-06
  • 打赏
  • 举报
回复
楼主问题解决了吗?
q403666704 2016-05-13
  • 打赏
  • 举报
回复
我的也不起作用,与你情况一样
好名字给猪了 2015-12-08
  • 打赏
  • 举报
回复
我用到 springmvc , mybatis ,shiro,redis,没有遇到楼主的情况。
远行者 2015-12-07
  • 打赏
  • 举报
回复
有没有人遇到过呀?
远行者 2015-11-04
  • 打赏
  • 举报
回复
各位大神又遇到的没?自己先顶一下,不要沉了!

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧