关于拦截器中使用@Autowired以及@Value注解值为null的问题

1.项目需要自定义了一个拦截器,需要在拦截器中获取对应的值所以使用了@Autowired以及@Value注解,但是这么引入取到的值都是NULL值,DEBUG查看以下三个值都为NULL
在这里插入图片描述
2.先说下原因,导致为NULL的原因是
(1)拦截器加载的时间点是先于SpringContext的
(2)在代码中使用了new GisInterceptor()(这个GisInterceptor是我自己定义的拦截器名称),new GisInterceptor()会导致个类完全没有交给Spring容器管理,所以@Autowired以及@Value不会在自己定义的拦截器中生效
3.最后说解决方法
(1). 将自己定义的拦截器交给spring容器管理,也就是在自己定义的拦截器上加上@Component注解
(2)代码中有用到new GisInterceptor()的,就用注入代替
在这里插入图片描述
我是因为在下面图片的类中用到了new GisInterceptor(),所以在这里用注入代替了new
在这里插入图片描述
以上解决方法亲测有效,如果按照上面的修改方法没生效,也可以看下这位老哥的解决方法,要达到的目的都是一致的:
https://blog.csdn.net/Huang1178387848/article/details/114005294

最后一个关于关于@Value注入为NULL的问题
我之前是这么去写的,在其他的类中可以注入到,但是这个类中获取不到,估计也是因为没有将这个类交给spring容器管理
在这里插入图片描述
@Value获取的值为NULL最后的解决方法是按照如图这样去写就可以了,这个方法比较粗暴,直接通过静态类做的获取
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过自定义注解拦截器的方式实现类似@Cacheable的注解方法拦截FeignClient的请求调用。 具体实现步骤如下: 1. 定义自定义注解,比如@FeignCacheable,并指定缓存名称和缓存key。 ```java @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface FeignCacheable { String value(); String key(); } ``` 2. 编写拦截器,拦截带有@FeignCacheable注解的方法,并根据注解信息从缓存获取数据或发起FeignClient请求获取数据。 ```java public class FeignCacheableInterceptor implements ClientHttpRequestInterceptor { private RedisTemplate<String, Object> redisTemplate; public FeignCacheableInterceptor(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { // 判断请求方法是否带有@FeignCacheable注解 FeignCacheable feignCacheable = getAnnotation(request.getHeaders(), FeignCacheable.class); if (feignCacheable != null) { String key = feignCacheable.key(); String cacheName = feignCacheable.value(); // 从缓存获取数据 Object cacheData = redisTemplate.opsForValue().get(key); if (cacheData != null) { // 缓存存在数据,直接返回 return new CachedResponse(cacheData); } else { // 缓存不存在数据,发起FeignClient请求 ClientHttpResponse response = execution.execute(request, body); byte[] responseBytes = StreamUtils.copyToByteArray(response.getBody()); // 将请求结果存入缓存 redisTemplate.opsForValue().set(key, responseBytes); redisTemplate.expire(key, 1, TimeUnit.MINUTES); return new CachedResponse(responseBytes); } } else { // 没有@FeignCacheable注解,直接执行请求 return execution.execute(request, body); } } private <T extends Annotation> T getAnnotation(HttpHeaders headers, Class<T> annotationClass) { RequestTemplate template = new RequestTemplate(); headers.forEach((key, values) -> template.header(key, values.toArray(new String[0]))); return template.methodMetadata().method().getAnnotation(annotationClass); } private static class CachedResponse implements ClientHttpResponse { private byte[] body; public CachedResponse(byte[] body) { this.body = body; } @Override public InputStream getBody() throws IOException { return new ByteArrayInputStream(body); } // 省略其他方法 } } ``` 3. 在FeignClient的配置添加拦截器。 ```java @Configuration public class FeignConfig { @Autowired private RedisTemplate<String, Object> redisTemplate; @Bean public Feign.Builder feignBuilder() { return Feign.builder() .client(new OkHttpClient()) .requestInterceptor(new FeignCacheableInterceptor(redisTemplate)); } } ``` 通过以上步骤实现了类似@Cacheable的注解方法拦截FeignClient的请求调用并缓存数据的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值