4646
4747/**
4848 * The default implementation of {@link McpStreamableServerTransportProvider}.
49- * The FIT transport provider for MCP Server, according to {@code WebMvcStreamableServerTransportProvider} in MCP SDK.
49+ * The FIT transport provider for MCP Server, according to {@code HttpServletStreamableServerTransportProvider} in MCP
50+ * SDK.
5051 *
5152 * @author 黄可欣
5253 * @since 2025-09-30
@@ -143,7 +144,7 @@ public Mono<Void> notifyClients(String method, Object params) {
143144 try {
144145 session .sendNotification (method , params ).block ();
145146 } catch (Exception e ) {
146- logger .error ("Failed to send message to session {}: {}" , session .getId (), e .getMessage ());
147+ logger .error ("Failed to send message to session {}: {}" , session .getId (), e .getMessage (), e );
147148 }
148149 });
149150 });
@@ -164,7 +165,7 @@ public Mono<Void> closeGracefully() {
164165 try {
165166 session .closeGracefully ().block ();
166167 } catch (Exception e ) {
167- logger .error ("Failed to close session {}: {}" , session .getId (), e .getMessage ());
168+ logger .error ("Failed to close session {}: {}" , session .getId (), e .getMessage (), e );
168169 }
169170 });
170171
@@ -219,7 +220,7 @@ public Object handleGet(HttpClassicServerRequest request, HttpClassicServerRespo
219220 }
220221 });
221222 } catch (Exception e ) {
222- logger .error ("Failed to handle GET request for session {}: {}" , sessionId , e .getMessage ());
223+ logger .error ("Failed to handle GET request for session {}: {}" , sessionId , e .getMessage (), e );
223224 response .statusCode (HttpResponseStatus .INTERNAL_SERVER_ERROR .statusCode ());
224225 return null ;
225226 }
@@ -266,9 +267,11 @@ public Object handlePost(HttpClassicServerRequest request, HttpClassicServerResp
266267
267268 // Handle JSONRPCMessage
268269 if (message instanceof McpSchema .JSONRPCResponse jsonrpcResponse ) {
269- return handleJsonRpcResponse (jsonrpcResponse , session , transportContext , response );
270+ handleJsonRpcResponse (jsonrpcResponse , session , transportContext , response );
271+ return null ;
270272 } else if (message instanceof McpSchema .JSONRPCNotification jsonrpcNotification ) {
271- return handleJsonRpcNotification (jsonrpcNotification , session , transportContext , response );
273+ handleJsonRpcNotification (jsonrpcNotification , session , transportContext , response );
274+ return null ;
272275 } else if (message instanceof McpSchema .JSONRPCRequest jsonrpcRequest ) {
273276 return handleJsonRpcRequest (jsonrpcRequest , session , sessionId , transportContext , response );
274277 } else {
@@ -277,12 +280,12 @@ public Object handlePost(HttpClassicServerRequest request, HttpClassicServerResp
277280 McpError .builder (McpSchema .ErrorCodes .INTERNAL_ERROR ).message ("Unknown message type" ).build ());
278281 }
279282 } catch (IllegalArgumentException | IOException e ) {
280- logger .error ("Failed to deserialize message: {}" , e .getMessage ());
283+ logger .error ("Failed to deserialize message: {}" , e .getMessage (), e );
281284 response .statusCode (HttpResponseStatus .BAD_REQUEST .statusCode ());
282285 return Entity .createObject (response ,
283286 McpError .builder (McpSchema .ErrorCodes .PARSE_ERROR ).message ("Invalid message format" ).build ());
284287 } catch (Exception e ) {
285- logger .error ("Error handling message: {}" , e .getMessage ());
288+ logger .error ("Error handling message: {}" , e .getMessage (), e );
286289 response .statusCode (HttpResponseStatus .INTERNAL_SERVER_ERROR .statusCode ());
287290 return Entity .createObject (response ,
288291 McpError .builder (McpSchema .ErrorCodes .INTERNAL_ERROR ).message (e .getMessage ()).build ());
@@ -323,7 +326,7 @@ public Object handleDelete(HttpClassicServerRequest request, HttpClassicServerRe
323326 response .statusCode (HttpResponseStatus .OK .statusCode ());
324327 return null ;
325328 } catch (Exception e ) {
326- logger .error ("Failed to delete session {}: {}" , sessionId , e .getMessage ());
329+ logger .error ("Failed to delete session {}: {}" , sessionId , e .getMessage (), e );
327330 response .statusCode (HttpResponseStatus .INTERNAL_SERVER_ERROR .statusCode ());
328331 return Entity .createObject (response ,
329332 McpError .builder (McpSchema .ErrorCodes .INTERNAL_ERROR ).message (e .getMessage ()).build ());
@@ -423,12 +426,12 @@ private void handleReplaySseRequest(HttpClassicServerRequest request, McpTranspo
423426 .contextWrite (ctx -> ctx .put (McpTransportContext .KEY , transportContext ))
424427 .block ();
425428 } catch (Exception e ) {
426- logger .error ("Failed to replay message: {}" , e .getMessage ());
429+ logger .error ("Failed to replay message: {}" , e .getMessage (), e );
427430 emitter .fail (e );
428431 }
429432 });
430433 } catch (Exception e ) {
431- logger .error ("Failed to replay messages: {}" , e .getMessage ());
434+ logger .error ("Failed to replay messages: {}" , e .getMessage (), e );
432435 emitter .fail (e );
433436 }
434437 }
@@ -507,7 +510,7 @@ private Object handleInitializeRequest(HttpClassicServerRequest request, HttpCla
507510 return Entity .createObject (response ,
508511 new McpSchema .JSONRPCResponse (McpSchema .JSONRPC_VERSION , jsonrpcRequest .id (), initResult , null ));
509512 } catch (Exception e ) {
510- logger .error ("Failed to initialize session: {}" , e .getMessage ());
513+ logger .error ("Failed to initialize session: {}" , e .getMessage (), e );
511514 response .statusCode (HttpResponseStatus .INTERNAL_SERVER_ERROR .statusCode ());
512515 return Entity .createObject (response ,
513516 McpError .builder (McpSchema .ErrorCodes .INTERNAL_ERROR ).message (e .getMessage ()).build ());
@@ -523,13 +526,11 @@ private Object handleInitializeRequest(HttpClassicServerRequest request, HttpCla
523526 * @param session The {@link McpStreamableServerSession} to accept the response
524527 * @param transportContext The {@link McpTransportContext} for request context propagation
525528 * @param response The {@link HttpClassicServerResponse} to set the status code
526- * @return {@code null} as the response status is set to {@code 202 Accepted}
527529 */
528- private Object handleJsonRpcResponse (McpSchema .JSONRPCResponse jsonrpcResponse , McpStreamableServerSession session ,
530+ private void handleJsonRpcResponse (McpSchema .JSONRPCResponse jsonrpcResponse , McpStreamableServerSession session ,
529531 McpTransportContext transportContext , HttpClassicServerResponse response ) {
530532 session .accept (jsonrpcResponse ).contextWrite (ctx -> ctx .put (McpTransportContext .KEY , transportContext )).block ();
531533 response .statusCode (HttpResponseStatus .ACCEPTED .statusCode ());
532- return null ;
533534 }
534535
535536 /**
@@ -541,16 +542,14 @@ private Object handleJsonRpcResponse(McpSchema.JSONRPCResponse jsonrpcResponse,
541542 * @param session The {@link McpStreamableServerSession} to accept the notification
542543 * @param transportContext The {@link McpTransportContext} for request context propagation
543544 * @param response The {@link HttpClassicServerResponse} to set the status code
544- * @return {@code null} as the response status is set to {@code 202 Accepted}
545545 */
546- private Object handleJsonRpcNotification (McpSchema .JSONRPCNotification jsonrpcNotification ,
546+ private void handleJsonRpcNotification (McpSchema .JSONRPCNotification jsonrpcNotification ,
547547 McpStreamableServerSession session , McpTransportContext transportContext ,
548548 HttpClassicServerResponse response ) {
549549 session .accept (jsonrpcNotification )
550550 .contextWrite (ctx -> ctx .put (McpTransportContext .KEY , transportContext ))
551551 .block ();
552552 response .statusCode (HttpResponseStatus .ACCEPTED .statusCode ());
553- return null ;
554553 }
555554
556555 /**
@@ -593,7 +592,7 @@ public void onFailed(Exception e) {
593592 .contextWrite (ctx -> ctx .put (McpTransportContext .KEY , transportContext ))
594593 .block ();
595594 } catch (Exception e ) {
596- logger .error ("Failed to handle request stream: {}" , e .getMessage ());
595+ logger .error ("Failed to handle request stream: {}" , e .getMessage (), e );
597596 emitter .fail (e );
598597 }
599598 });
@@ -681,13 +680,14 @@ public Mono<Void> sendMessage(McpSchema.JSONRPCMessage message, String messageId
681680
682681 logger .info ("[SSE] Sending message to session {}: {}" , this .sessionId , jsonText );
683682 } catch (Exception e ) {
684- logger .error ("Failed to send message to session {}: {}" , this .sessionId , e .getMessage ());
683+ logger .error ("Failed to send message to session {}: {}" , this .sessionId , e .getMessage (), e );
685684 try {
686685 this .emitter .fail (e );
687686 } catch (Exception errorException ) {
688687 logger .error ("Failed to send error to SSE builder for session {}: {}" ,
689688 this .sessionId ,
690- errorException .getMessage ());
689+ errorException .getMessage (),
690+ errorException );
691691 }
692692 } finally {
693693 this .lock .unlock ();
0 commit comments