2014-11-23 3 views
0

doFilter에서 호출하면 스프링 캐쉬가 작동하지 않습니다.스프링 캐쉬가 doFilter에서 작동하지 않습니다.

하는 것으로 봄 캐시 doFilter에서 호출하지 않으면 작동하고() (예를 들어, 나머지 서비스에서 호출하는 경우)

어떻게 doFilter에서 캐시를 활성화 할 수 있습니다()? (아마도 캐시가 doFilter에서 허용되지 않습니다?)

@Configuration 
@EnableCaching 
public class CredentialsInjectionFilter implements javax.servlet.Filter { 

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

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
    throws IOException, ServletException { 
     display(5); 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 

    @Cacheable("tenants") 
    public void display(int number) { 
     // if cache working properly, code below will not execute after the first calling 
     for(int i=0; i<50; i++) { 
       System.out.println("ramon called" +number); 
     } 
    } 
+1

아무 것도 반환하지 않는 메소드에 @Cacheable을 적용하고 있습니다 (void 반환 유형). 이 시나리오에서 어떤 일이 발생할 것으로 예상합니까? – Jigish

답변

0

방법은 별도의 서비스 클래스

CacheService

에 캐싱 세부 사항을 org.springframework.web.filter.GenericFilterBean을 확장 및 이동에 대한
import java.util.Arrays; 

import org.springframework.cache.CacheManager; 
import org.springframework.cache.annotation.Cacheable; 
import org.springframework.cache.concurrent.ConcurrentMapCache; 
import org.springframework.cache.support.SimpleCacheManager; 
import org.springframework.context.annotation.Bean; 
import org.springframework.stereotype.Component; 

    @Component 
    public class CacheService{ 

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


     @Cacheable("tenants") 
     public void display(int number) { 
      // if cache working properly, code below will not execute after the first calling 
      for(int i=0; i<50; i++) { 
        System.out.println("ramon called" +number); 
      } 
     } 
    } 

CredentialsInjectionFilter

import java.io.IOException; 

import javax.servlet.FilterChain; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.filter.GenericFilterBean; 

@Component 
public class CredentialsInjectionFilter extends GenericFilterBean { 

    @Autowired 
    private CacheService cacheService; 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
    throws IOException, ServletException { 
     cacheService.display(5); 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 
} 
관련 문제