Я разработал конечную точку REST в Springboot, которая принимает String
ID и отвечает ModelAndView
. Эта конечная точка помечена @Cacheable
аннотацией. Теперь есть две вещи, которые могут произойти в данной конечной точке.
Случай 1: Идентификатор запроса существует в БД и дает URL, на который должно произойти перенаправление. В этом случае ответ должен кэшироваться таким образом, чтобы при последовательных запросах одного и того же идентификатора результат мог передаваться из кэша
Случай 2. Запрашиваемый идентификатор не существует в БД и, следовательно, должно происходить перенаправление в этом сценарии должен быть указан c URL-адрес, и в этом сценарии не следует выполнять кэширование.
Итак, ниже приведен мой метод
@GetMapping("{id}")
@Cacheable(value = "url-single", key = "#id", unless = "#result.view!=\"redirect:/notfound\"")
public ModelAndView redirect(@PathVariable("id") String id, ServletRequest servletRequest,
ServletResponse servletResponse) {
HttpServletRequest request = HttpServletRequest.class.cast(servletRequest);
LOG.info("Redirection request from: {} for Short URL Key: {}", request.getRemoteAddr(), id);
try {
Optional<String> originalUrlOptional = urlManagerService.retrieveOriginalUrl(id);
if (originalUrlOptional.isPresent() && !StringUtils.isEmpty(originalUrlOptional.get())) {
LOG.info("Found Original URL: {} for Short URL Key: {}", originalUrlOptional.get(), id);
return new ModelAndView("redirect:https://" + originalUrlOptional.get());
}
} catch (NoSuchElementException e) {
LOG.error("Error while redirecting: {}", e.getMessage(), e);
}
return new ModelAndView("redirect:/notfound");
}
Если я правильно понял из здесь , ключевое слово unless
в @Cacheable
применяется к возвращаемому типу , и для доступа к любой конкретной переменной-члену объекта возвращаемого типа мы должны ссылаться на него как #result.attributeName <comparison> <value>
.
Так почему же в моем кэше Redis ничего не хранится? Если я уберу условие unless
, все будет сохранено. Неправильно ли состояние?