This project separates protocol logic from transport and framework wiring.
| Module | Responsibility | Depends on |
|---|---|---|
jsonrpc-core |
JSON-RPC 2.0 protocol model and dispatch pipeline | Jackson 3, JSpecify |
jsonrpc-spring-webmvc |
Servlet/WebMVC endpoint and HTTP status strategy | jsonrpc-core, Spring Web |
jsonrpc-spring-boot-autoconfigure |
Bean wiring, property binding/validation, scanning, metrics/access integration | jsonrpc-core, jsonrpc-spring-webmvc, Spring Boot |
jsonrpc-spring-boot-starter |
Consumer-facing starter dependency bundle | Core + adapters |
flowchart LR
A["HTTP request body"] --> B["JsonRpcWebMvcEndpoint"]
B --> C["ObjectMapper parse to JsonNode"]
C --> D["JsonRpcDispatcher"]
D --> E["RequestParser"]
D --> F["RequestValidator"]
D --> G["MethodRegistry + MethodInvoker"]
D --> H["ExceptionResolver + ResponseComposer"]
D --> I["Interceptors + NotificationExecutor"]
D --> J["JsonRpcDispatchResult"]
J --> K["JsonRpcHttpStatusStrategy"]
K --> L["HTTP status + JSON body/no body"]
JsonRpcDispatcher composes these interfaces:
JsonRpcRequestParserJsonRpcRequestValidatorJsonRpcMethodRegistryJsonRpcMethodInvokerJsonRpcExceptionResolverJsonRpcResponseComposerJsonRpcNotificationExecutor- ordered
JsonRpcInterceptorchain
Design goal: each concern is replaceable without rewriting the dispatcher.
Response-side transport integrations can use these additional protocol components:
JsonRpcEnvelopeClassifierJsonRpcResponseParserJsonRpcResponseValidatorJsonRpcResponseValidationOptions
Method registration order in Spring Boot:
JsonRpcMethodRegistrationbeans during dispatcher creation (orderedStream)@JsonRpcMethodscanning after singleton initialization (SmartInitializingSingleton)
Duplicate behavior is controlled by jsonrpc.method-registration-conflict-policy.
Protocol-level normalization:
- parse error ->
-32700 - invalid request ->
-32600 - method not found ->
-32601 - invalid params -> default
-32602(paramstype-violation code is configurable inDefaultJsonRpcRequestValidator) - unhandled exceptions ->
-32603
Transport-level status is handled separately by JsonRpcHttpStatusStrategy.
Spring Boot users can override pipeline beans because auto-configuration uses @ConditionalOnMissingBean.
Typical extension cases:
- custom request validator policy
- domain-specific exception mapping
- custom method registry implementation
- custom notification execution (executor/backpressure/retry)
- alternate HTTP status policy
The runtime stack is intentionally minimal:
- core protocol path does not require Spring
- no direct dependency on Guava, Commons Lang3, or Jakarta Validation API
- Jackson and Spring dependencies are scoped by module responsibility