diff --git a/larksuite-oapi/pom.xml b/larksuite-oapi/pom.xml
index 9ed284221..42c11a831 100644
--- a/larksuite-oapi/pom.xml
+++ b/larksuite-oapi/pom.xml
@@ -200,6 +200,35 @@
2.9.0
compile
+
+
+
+ io.projectreactor
+ reactor-core
+ 3.7.0
+ provided
+
+
+ org.springframework
+ spring-web
+ 5.3.39
+ provided
+
+
+
+ jakarta.servlet
+ jakarta.servlet-api
+ 6.0.0
+ provided
+
+
+
+ javax.servlet
+ javax.servlet-api
+ 4.0.1
+ provided
+
+
Larksuite open platform facilitates the integration of enterprise applications and
larksuite, making
diff --git a/larksuite-oapi/src/main/java/com/lark/oapi/event/SpringAdapter.java b/larksuite-oapi/src/main/java/com/lark/oapi/event/SpringAdapter.java
new file mode 100644
index 000000000..04c234e57
--- /dev/null
+++ b/larksuite-oapi/src/main/java/com/lark/oapi/event/SpringAdapter.java
@@ -0,0 +1,112 @@
+package com.lark.oapi.event;
+
+import com.lark.oapi.core.IHandler;
+import com.lark.oapi.core.request.EventReq;
+import com.lark.oapi.core.response.EventResp;
+import com.lark.oapi.core.utils.IOs;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.io.buffer.DataBufferUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+
+@SuppressWarnings("unused")
+public class SpringAdapter {
+
+ private static final Logger log = LoggerFactory.getLogger(SpringAdapter.class);
+
+ public static ResponseEntity handlerJavaxServletWebhook(javax.servlet.http.HttpServletRequest request, IHandler handler) {
+ try {
+ // read request headers
+ HttpHeaders requestHeaders = new HttpHeaders();
+ Enumeration names = request.getHeaderNames();
+ while (names.hasMoreElements()) {
+ String name = names.nextElement();
+ List values = Collections.list(request.getHeaders(name));
+ requestHeaders.put(name, values);
+ }
+ byte[] body = IOs.readAll(request.getInputStream());
+ // build event request
+ EventReq req = new EventReq();
+ req.setHeaders(requestHeaders);
+ req.setBody(body);
+ req.setHttpPath(request.getRequestURI());
+ // handle event
+ EventResp resp = handler.handle(req);
+ // build response
+ HttpHeaders responseHeaders = new HttpHeaders();
+ responseHeaders.putAll(resp.getHeaders());
+ return ResponseEntity.status(resp.getStatusCode())
+ .headers(responseHeaders)
+ .body(new String(resp.getBody()));
+ } catch (Throwable e) {
+ log.error("handler javax.servlet webhook error", e);
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
+ }
+ }
+
+ public static ResponseEntity handlerJakartaServletWebhook(jakarta.servlet.http.HttpServletRequest request, IHandler handler) {
+ try {
+ // read request headers
+ HttpHeaders requestHeaders = new HttpHeaders();
+ Enumeration names = request.getHeaderNames();
+ while (names.hasMoreElements()) {
+ String name = names.nextElement();
+ List values = Collections.list(request.getHeaders(name));
+ requestHeaders.put(name, values);
+ }
+ byte[] body = IOs.readAll(request.getInputStream());
+ // build event request
+ EventReq req = new EventReq();
+ req.setHeaders(requestHeaders);
+ req.setBody(body);
+ req.setHttpPath(request.getRequestURI());
+ // handle event
+ EventResp resp = handler.handle(req);
+ HttpHeaders responseHeaders = new HttpHeaders();
+ responseHeaders.putAll(resp.getHeaders());
+ return ResponseEntity.status(resp.getStatusCode())
+ .headers(responseHeaders)
+ .body(new String(resp.getBody()));
+ } catch (Throwable e) {
+ log.error("handler jakarta.servlet webhook error", e);
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
+ }
+ }
+
+ public static Mono> handlerReactorWebHook(ServerWebExchange exchange, IHandler handler) {
+ return DataBufferUtils.join(exchange.getRequest().getBody())
+ .flatMap(buf -> {
+ byte[] bytes = new byte[buf.readableByteCount()];
+ buf.read(bytes);
+ DataBufferUtils.release(buf);
+ return Mono.just(bytes);
+ })
+ .map(body -> {
+ try {
+ // build event request
+ EventReq req = new EventReq();
+ req.setHeaders(exchange.getRequest().getHeaders());
+ req.setBody(body);
+ req.setHttpPath(exchange.getRequest().getURI().getPath());
+ // handle event
+ EventResp resp = handler.handle(req);
+ // build response
+ return ResponseEntity
+ .status(resp.getStatusCode())
+ .headers(headers -> headers.putAll(resp.getHeaders()))
+ .body(new String(resp.getBody()));
+ } catch (Throwable e) {
+ log.error("Event dispatch error", e);
+ return ResponseEntity.internalServerError().body(String.format(EventResp.RESPONSE_FORMAT, e.getMessage()));
+ }
+ });
+ }
+}
\ No newline at end of file