需要改返回值对象的请求头 给CDN做缓存

Blade 已结 1 305
嘻嘻哈哈
嘻嘻哈哈 剑侠 2025-03-18 16:42

一、该问题的重现步骤是什么?

1. 

2. 

3.


二、你期待的结果是什么?实际看到的又是什么?

数据需要在CDN做缓存 需要加一个生命周期的返回头

  'Cache-Control': 'max-age=300 Public, stale-while-revalidate=120',


三、你正在使用的是什么产品,什么版本?在什么操作系统上?


四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

1条回答
  •  admin
    admin (最佳回答者)
    2025-03-18 17:58

    还不是很能看明白,麻烦再详细描述一下需求呢

    作者追问:2025-03-18 17:58

    就是我要在返回结果上加一个请求头 去给我的CND 去做缓存  目的就是返回体上加一个头部

    回答: 2025-03-18 17:58

    如果是全局的话,加一个拦截器,大概代码是这样,注册到拦截器里生效

    public class CacheControlInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // 在请求处理之前,可以进行一些预处理工作
            return true;
        }
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            // 在请求处理后,添加 Cache-Control 头部
            response.setHeader("Cache-Control""max-age=300, public, stale-while-revalidate=120");
        }
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            // 请求完成后的一些清理工作
        }
    }


    作者追问:2025-03-18 17:58

    我这边引入官方的缓存注解 但是好像不能读取缓存的时候 cache对象没有注册进来 

    4.1.0

    image.png

    作者追问:2025-03-18 17:58

    image.png

    这个是配置

    作者追问:2025-03-18 17:58

    image.png


    image.png



    回答: 2025-03-18 17:58

    等这里初始化后看看呢

    CleanShot20250319141936@2x.png

    回答: 2025-03-18 17:58

    作者追问:2025-03-18 17:58

    image.png

    这边是启动后的断点、调用的时候还是cache还是为null

    作者追问:2025-03-18 17:58

    image.png

    我按照官方的改了 但是把启动之后

    image.png

    org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'applicationTaskExecutor': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)

    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:220)

    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)

    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205)

    at org.springframework.context.event.AbstractApplicationEventMulticaster.retrieveApplicationListeners(AbstractApplicationEventMulticaster.java:265)

    at org.springframework.context.event.AbstractApplicationEventMulticaster.getApplicationListeners(AbstractApplicationEventMulticaster.java:222)

    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:145)

    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:451)

    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:457)

    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:384)

    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1130)

    at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1093)

    at org.springframework.cloud.context.named.NamedContextFactory.destroy(NamedContextFactory.java:114)

    at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:211)

    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:587)

    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:559)

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:1202)

    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:520)

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:1195)

    at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1186)

    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:637)

    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)

    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)

    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456)

    at org.springframework.boot.SpringApplication.run(SpringApplication.java:335)

    at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:149)

    at org.springblade.core.launch.BladeApplication.run(BladeApplication.java:59)

    at org.springblade.pay.PayApplication.main(PayApplication.java:13)


    2025-03-19 14:59:05.581  WARN 20616 --- [           main] s.c.a.AnnotationConfigApplicationContext : Exception thrown from ApplicationListener handling ContextClosedEvent


    org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'applicationTaskExecutor': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)

    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:220)

    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)

    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205)

    at org.springframework.context.event.AbstractApplicationEventMulticaster.retrieveApplicationListeners(AbstractApplicationEventMulticaster.java:265)

    at org.springframework.context.event.AbstractApplicationEventMulticaster.getApplicationListeners(AbstractApplicationEventMulticaster.java:222)

    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:145)

    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:451)

    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:457)

    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:384)

    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1130)

    at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1093)

    at org.springframework.cloud.context.named.NamedContextFactory.destroy(NamedContextFactory.java:114)

    at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:211)

    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:587)

    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:559)

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:1202)

    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:520)

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:1195)

    at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1186)

    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:637)

    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)

    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)

    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456)

    at org.springframework.boot.SpringApplication.run(SpringApplication.java:335)

    at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:149)

    at org.springblade.core.launch.BladeApplication.run(BladeApplication.java:59)

    at org.springblade.pay.PayApplication.main(PayApplication.java:13)


    2025-03-19 14:59:05.584  INFO 20616 --- [ctor_TMROLE_1_1] i.s.c.r.n.AbstractNettyRemotingClient    : channel inactive: [id: 0x7336ec7b, L:/127.0.0.1:51280 ! R:/127.0.0.1:8091]

    2025-03-19 14:59:05.584  INFO 20616 --- [ctor_TMROLE_1_1] i.s.c.r.netty.NettyClientChannelManager  : return to pool, rm channel:[id: 0x7336ec7b, L:/127.0.0.1:51280 ! R:/127.0.0.1:8091]

    2025-03-19 14:59:05.584  INFO 20616 --- [ctor_TMROLE_1_1] i.s.core.rpc.netty.NettyPoolableFactory  : channel valid false,channel:[id: 0x7336ec7b, L:/127.0.0.1:51280 ! R:/127.0.0.1:8091]

    2025-03-19 14:59:05.584  INFO 20616 --- [ctor_TMROLE_1_1] i.s.core.rpc.netty.NettyPoolableFactory  : will destroy channel:[id: 0x7336ec7b, L:/127.0.0.1:51280 ! R:/127.0.0.1:8091]

    2025-03-19 14:59:05.584  INFO 20616 --- [ctor_TMROLE_1_1] i.s.c.r.n.AbstractNettyRemotingClient    : ChannelHandlerContext(AbstractNettyRemotingClient$ClientHandler#0, [id: 0x7336ec7b, L:/127.0.0.1:51280 ! R:/127.0.0.1:8091]) will closed

    2025-03-19 14:59:05.585  INFO 20616 --- [ctor_TMROLE_1_1] i.s.c.r.n.AbstractNettyRemotingClient    : ChannelHandlerContext(AbstractNettyRemotingClient$ClientHandler#0, [id: 0x7336ec7b, L:/127.0.0.1:51280 ! R:/127.0.0.1:8091]) will closed

    2025-03-19 14:59:05.588  INFO 20616 --- [ctor_RMROLE_1_1] i.s.c.r.n.AbstractNettyRemotingClient    : channel inactive: [id: 0x66958f68, L:/127.0.0.1:51304 ! R:/127.0.0.1:8091]

    2025-03-19 14:59:05.588  INFO 20616 --- [ctor_RMROLE_1_1] i.s.c.r.netty.NettyClientChannelManager  : return to pool, rm channel:[id: 0x66958f68, L:/127.0.0.1:51304 ! R:/127.0.0.1:8091]

    2025-03-19 14:59:05.588  INFO 20616 --- [ctor_RMROLE_1_1] i.s.core.rpc.netty.NettyPoolableFactory  : channel valid false,channel:[id: 0x66958f68, L:/127.0.0.1:51304 ! R:/127.0.0.1:8091]

    2025-03-19 14:59:05.588  INFO 20616 --- [ctor_RMROLE_1_1] i.s.core.rpc.netty.NettyPoolableFactory  : will destroy channel:[id: 0x66958f68, L:/127.0.0.1:51304 ! R:/127.0.0.1:8091]

    2025-03-19 14:59:05.588  INFO 20616 --- [ctor_RMROLE_1_1] i.s.c.r.n.AbstractNettyRemotingClient    : ChannelHandlerContext(AbstractNettyRemotingClient$ClientHandler#0, [id: 0x66958f68, L:/127.0.0.1:51304 ! R:/127.0.0.1:8091]) will closed

    2025-03-19 14:59:05.588  INFO 20616 --- [ctor_RMROLE_1_1] i.s.c.r.n.AbstractNettyRemotingClient    : ChannelHandlerContext(AbstractNettyRemotingClient$ClientHandler#0, [id: 0x66958f68, L:/127.0.0.1:51304 ! R:/127.0.0.1:8091]) will closed

    2025-03-19 14:59:05.617  INFO 20616 --- [           main] .s.b.a.l.ConditionEvaluationReportLogger : 


    Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.

    2025-03-19 14:59:05.671 ERROR 20616 --- [           main] o.s.boot.SpringApplication               : Application run failed


    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'welcomePageHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Failed to instantiate [org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping]: Factory method 'welcomePageHandlerMapping' threw exception with message: Cannot invoke "org.springframework.context.ApplicationContext.getBean(java.lang.Class)" because "org.springblade.core.tool.utils.SpringUtil.context" is null

    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:648)

    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:636)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1337)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1167)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)

    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)

    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)

    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)

    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975)

    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:962)

    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624)

    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)

    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)

    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456)

    at org.springframework.boot.SpringApplication.run(SpringApplication.java:335)

    at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:149)

    at org.springblade.core.launch.BladeApplication.run(BladeApplication.java:59)

    at org.springblade.pay.PayApplication.main(PayApplication.java:13)

    Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping]: Factory method 'welcomePageHandlerMapping' threw exception with message: Cannot invoke "org.springframework.context.ApplicationContext.getBean(java.lang.Class)" because "org.springblade.core.tool.utils.SpringUtil.context" is null

    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:177)

    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:644)

    ... 19 common frames omitted

    Caused by: java.lang.NullPointerException: Cannot invoke "org.springframework.context.ApplicationContext.getBean(java.lang.Class)" because "org.springblade.core.tool.utils.SpringUtil.context" is null

    at org.springblade.core.tool.utils.SpringUtil.getBean(SpringUtil.java:61)

    at org.springblade.core.http.cache.HttpCacheConfiguration.addInterceptors(HttpCacheConfiguration.java:71)

    at org.springframework.web.servlet.config.annotation.WebMvcConfigurerComposite.addInterceptors(WebMvcConfigurerComposite.java:88)

    at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration.addInterceptors(DelegatingWebMvcConfiguration.java:83)

    at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.getInterceptors(WebMvcConfigurationSupport.java:358)

    at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration.createWelcomePageHandlerMapping(WebMvcAutoConfiguration.java:439)

    at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration.welcomePageHandlerMapping(WebMvcAutoConfiguration.java:419)

    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)

    at java.base/java.lang.reflect.Method.invoke(Method.java:578)

    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:140)

    ... 20 common frames omitted


    回答: 2025-03-18 17:58

    还有个提交:https://center.javablade.com/blade/BladeX-Tool/commit/b8e4937d96f86c7ff345e7c48a3486c19a8e6443


    另外启动配置是 blade.http.cache.enabled=true,你的enabled好像少了个 d

    作者追问:2025-03-18 17:58

    image.png

    image.png

    看一下我这个改法可以吗、我本地运行是没有问题的

    image.png

    回答: 2025-03-18 17:58

    可以的

    0 讨论(1)
代码语言
提交回复