У меня есть конечная точка Api с Spring 5 как @RestController, и я хочу указать Cache-Control для всех конечных точек одновременно (через Config или Аннотация, ...).
В настоящее время я делаю это для каждого метода. Мне также пришлось использовать ResponseEntity для установки Cache-Control, который еще больше раздувает код.
@RestController
@RequestMapping("/api")
public class MyApi {
@PostMapping("/search")
public ResponseEntity<SearchResultDto> search(SearchDto searchDto) {
// ...
return ResponseEntity.ok()
.cacheControl(CacheControl.maxAge(20, TimeUnit.SECONDS))
.body(searchResultDto);
}
@GetMapping("/get")
public ResponseEntity<EntityDto> get(Long id) {
// ...
return ResponseEntity.ok()
.cacheControl(CacheControl.maxAge(20, TimeUnit.SECONDS))
.body(entityDto);
}
// ... more methods
}
- Я попробовал Аспекты, но невозможно изменить заголовки http после их создания.
@Aspect
@Component
public class CacheAspect {
@Pointcut("within(io.company.MyApi)")
public void apiMethods() {
}
@Around("apiMethods()")
public Object addCacheControlOnResponseEntity(ProceedingJoinPoint pjp) throws Throwable {
Object retval = pjp.proceed();
if (retval instanceof ResponseEntity) {
((ResponseEntity) retval).getHeaders().setCacheControl(CacheControl.maxAge(15, TimeUnit.SECONDS));
// exception is thrown, because map can not be modified anymore
}
return retval;
}
}
- Я пробовал перехватчики (HandlerInterceptor), но здесь та же проблема, что заголовки http не могут быть изменены впоследствии.
@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptor() {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
response.setHeader(HttpHeaders.CACHE_CONTROL, CacheControl.maxAge(2, TimeUnit.SECONDS).getHeaderValue());
// header does not get modified
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
response.setHeader(HttpHeaders.CACHE_CONTROL, CacheControl.maxAge(2, TimeUnit.SECONDS).getHeaderValue());
// header does not get modified
}
});
}
}
- Я попытался добавить обработчик ресурсов (ResourceHandler) (для обычно статического содержимого) и установить стратегию кэширования для / api / **, но он не был применен.
@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/api/**")
.setCacheControl(CacheControl.maxAge(10, TimeUnit.SECONDS));
// didn't had any effect
}
}
... У меня нет идей
Что я могу сделать, чтобы написать меньше дубликатов / шаблонных кодов?