Na aula sobre Redis, as anotações de Cache foram movidas do Controller para o Service. Porém, uma chamada GET pode vir com ou sem parâmetros (nomeCurso para busca por nome, detalhes de paginação como Page e Size). Sendo assim, o Cache armazenado para uma busca específica, acaba sendo utilizado como retorno para outra busca.
Existe alguma forma nas anotações do Service de registrar os parametros que foram utilizados, para caso sejam distintos numa proxima requisição, não seja utilizado o cache?
A solução que pensei, não sei se a mais correta, seria deixar as anotações no controller e separar as chamadas como exemplo:
Chamada GET caso 1: Sem qualquer filtro
Chamada GET caso 2: Com paginação ou Busca por nome
Sendo que a unica que possuiria cache seria a sem filtro, visto que seria sempre a mesma requisição
Abaixo, trechos do código da aula:
class TopicoController(private val service: TopicoService) {
@GetMapping
fun listar(@RequestParam(required = false) nomeCurso : String?,
@PageableDefault(size=5, sort = ["dataCriacao"], direction = Sort.Direction.DESC) paginacao: Pageable)
: Page<TopicoView> = service.listar(nomeCurso, paginação)
// resto omitido
@Service
class TopicoService(
private val repository: TopicoRepository,
private val topicoViewMapper: TopicoViewMapper,
private val topicoFormMapper : TopicoFormMapper,
private val notFoundMessage : String = "Tópico não encontrado"
)
{
@Cacheable(cacheNames = ["topicos"], key = "#root.method.name")
fun listar(nomeCurso: String?, paginacao: Pageable): Page<TopicoView> {
val topicos = nomeCurso
?.let {repository.findByCursoNome(nomeCurso, paginacao)}
?: repository.findAll(paginacao)
return topicos.map { topicoViewMapper.map(it) }
}
// resto omitido