您的位置:首页 > 房产 > 家装 > Spring boot 注解实现幂等性

Spring boot 注解实现幂等性

2024/12/23 8:33:34 来源:https://blog.csdn.net/star20100906/article/details/139680261  浏览:    关键词:Spring boot 注解实现幂等性

1. 添加 Spring AOP 依赖

在 pom.xml 中添加如下依赖:

<dependencies><!-- Spring AOP dependency --><dependency><groupIdorg.springframework.boot</groupId><artifactIdspring-boot-starter-aop</artifactId></dependency>
</dependencies>

2. 创建自定义幂等性注解

创建一个新的 Java 注解类,通过 @interface 关键字来定义,并可以添加元注解以及属性。

/**
* 《像乌鸦一样思考》让孩子学会观察和独立思考!
* https://www.sanzhiwa.top/6718.html
*/
@Retention(RetentionPolicy.RUNTIME) // 程序运行时有效
@Target(ElementType.METHOD) // 方法注解
public @interface Idempotent {/*** 请求标识符的参数名称,默认为"requestId"*/String requestId() default "requestId";/*** 幂等有效时长(单位:秒)*/int expireTime() default 60;
}

3. 创建拦截器

/**
* 清华附小1-6年级趣味英语动画
* https://www.sanzhiwa.top/6711.html
*/
@Component
public class IdempotentInterceptor extends HandlerInterceptorAdapter {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {Method method = ((HandlerMethod) handler).getMethod();Idempotent idempotent = method.getAnnotation(Idempotent.class);if (idempotent != null) {// 获取请求中的唯一标识符String requestId = obtainRequestId(request, idempotent.requestId());// 判断该请求是否已经处理过if (redisTemplate.opsForValue().get(idempotentKey(requestId)) != null) {// 已经处理过,返回幂等响应response.getWriter().write("重复请求");return false;} else {// 将请求标识符存入Redis,并设置过期时间redisTemplate.opsForValue().set(idempotentKey(requestId), "processed", idempotent.expireTime(), TimeUnit.SECONDS);return true; // 继续执行业务逻辑}}return super.preHandle(request, response, handler);}private String idempotentKey(String requestId) {return "idempotent:" + requestId;}private String obtainRequestId(HttpServletRequest request, String paramName) {// 实现从请求中获取唯一标识符的方法return request.getParameter(paramName);}
}

4. 配置拦截器

在 Spring Boot 配置文件类中,添加拦截器配置:

/**
* 儿童新概念英语
* https://www.sanzhiwa.top/6696.html
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate IdempotentInterceptor idempotentInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(idempotentInterceptor).addPathPatterns("/**"); // 拦截所有接口}
}

5.使用自定义注解

最后,在需要进行幂等控制的 Controller 方法上使用 @Idempotent 注解:

/**
*
* 微观小世界】奇趣探险,启程进入神秘的微观世界!
* https://www.sanzhiwa.top/6704.html
*/
@RestController
public class TestController {@PostMapping("/order")@Idempotent(requestId = "orderId") // 假设orderId是从客户端传来的唯一标识订单请求的参数public String placeOrder(@RequestParam("orderId") String orderId, ...) {// 业务处理逻辑}
}

这样,当有相同的请求 ID 在指定的有效期内再次发起请求时,会被拦截器识别并阻止其重复执行业务逻辑

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com