Spring:Spring-cache无法正常工作

时间:2015-08-06 09:04:07

标签: java spring spring-mvc caching spring-cache

我正在开发一个Spring-MVC应用程序。在探查器经过后端之后,我注意到getCurrentlyAuthenticatedUser()是一个热点。因为我想到使用缓存。不幸的是它不起作用。一旦用户登录,即使用户已登录,我也会获得空用户。出现了什么问题。当我从XML中删除@Cacheable注释和配置时,一切正常。任何帮助都会很好。

PersonServiceImpl:

@Service
@Transactional
public class PersonServiceImpl implements PersonService {

  private final PersonDAO personDAO;

   @Autowired
    public PersonServiceImpl(PersonDAO personDAO) {
        this.personDAO = personDAO;
    }
 @Override
    @Cacheable(value = "person", condition = "#person == null")
    public Person getCurrentlyAuthenticatedUser() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null) {
            return null;
        } else {
            return personDAO.findPersonByUsername(authentication.getName());
        }
    }
}

使用缓存配置:

  <cache:annotation-driven />

    <beans:bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
        <beans:property name="caches">
            <beans:set>
                <beans:bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
                        p:name="person"/>
           </beans:set>
        </beans:property>
    </beans:bean>

当我调用此方法时,即使登录或未登录,我也会返回null。你能帮忙的话,我会很高兴。谢谢。

1 个答案:

答案 0 :(得分:2)

在下面的代码行中: -

@Cacheable(value = "person", condition = "#person == null")

尝试使用unless代替condition

实际上你已经提出了一个条件:“缓存仅在该人为空时才起作用”,这应该类似于“除非人为空,否则缓存将起作用”。 快乐的编码。