dromara/Sa-Token · error · NotImplException
10003
10003
Error message
未实现具体的 json 转换器
What it means
NotImplException (code 10003) thrown by SaJsonTemplateDefaultImpl.objectToJson(). Sa-Token core ships only this do-nothing default JSON template; actual serialization is provided by integration jars (sa-token-json-jackson, sa-token-json-gson, sa-token-json-fastjson, etc.). Hitting it means no real JSON converter was injected, so any framework feature that serializes to JSON (e.g. storing objects in session, sa-token's own JSON persistence) fails.
Source
Thrown at sa-token-core/src/main/java/cn/dev33/satoken/json/SaJsonTemplateDefaultImpl.java:37
import cn.dev33.satoken.exception.NotImplException;
import java.util.Map;
/**
* JSON 转换器,默认实现类
*
* <p> 如果代码断点走到了此默认实现类,说明框架没有注入有效的 JSON 转换器,需要开发者自行实现并注入 </p>
*
* @author click33
* @since 1.30.0
*/
public class SaJsonTemplateDefaultImpl implements SaJsonTemplate {
public static final String ERROR_MESSAGE = "未实现具体的 json 转换器";
@Override
public String objectToJson(Object obj) {
throw new NotImplException(ERROR_MESSAGE).setCode(SaErrorCode.CODE_10003);
}
@Override
public Object jsonToObject(String jsonStr) {
throw new NotImplException(ERROR_MESSAGE).setCode(SaErrorCode.CODE_10003);
}
@Override
public <T> T jsonToObject(String jsonStr, Class<T> type) {
throw new NotImplException(ERROR_MESSAGE).setCode(SaErrorCode.CODE_10003);
}
@Override
public Map<String, Object> jsonToMap(String jsonStr) {
throw new NotImplException(ERROR_MESSAGE).setCode(SaErrorCode.CODE_10003);
}
}View on GitHub (pinned to ac2c7f6e94)
Solutions
- Add a JSON integration dependency, e.g. <dependency><groupId>cn.dev33</groupId><artifactId>sa-token-json-jackson</artifactId><version>${sa-token.version}</version></dependency> (or gson/fastjson2 variant)
- If you intentionally have no integration jar, implement SaJsonTemplate yourself and inject: SaManager.setSaJsonTemplate(new MyJsonTemplate()) early at startup
- Verify only one sa-token-json-* jar is on the classpath and its version matches the core version
Example fix
// before: only sa-token-core on classpath // SaManager.getSaJsonTemplate().objectToJson(obj) -> NotImplException 10003 // after (pom.xml) <dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-json-jackson</artifactId> <version>1.44.0</version> </dependency>
Defensive patterns
Strategy: validation
Validate before calling
if (SaManager.getSaJsonTemplate() instanceof SaJsonTemplateDefaultImpl) {
// no real JSON converter injected; add sa-token-json-* dependency before using JSON features
} Type guard
boolean hasRealJsonTemplate() {
return !(SaManager.getSaJsonTemplate() instanceof cn.dev33.satoken.json.SaJsonTemplateDefaultImpl);
} Try / catch
try {
SaManager.getSaJsonTemplate().objectToJson(obj);
} catch (NotImplException e) {
if (e.getCode() == SaErrorCode.CODE_10003) { /* inject a SaJsonTemplate and retry once */ }
throw e;
} Prevention
- Always pair sa-token-core with a sa-token-json-* integration at the same version
- Assert at startup that SaManager.getSaJsonTemplate() is not the default impl
- When shading, preserve META-INF/services entries from integration jars
When it happens
Trigger: SaManager.getSaJsonTemplate() returns the default impl and application code — or sa-token internals — calls objectToJson(obj). Typical when the project depends on sa-token-core alone, or the JSON integration jar was excluded, and the plugin/SPI loader never registered a real SaJsonTemplate.
Common situations: Using sa-token-core without any sa-token-json-* dependency; excluding the json integration via Maven exclusions while pulling sa-token-spring-boot-starter transitively; a custom SaJsonTemplate registered after first use; classpath conflicts where the SPI file for the json plugin is missing.
Related errors
AI-assisted analysis of dromara/Sa-Token@ac2c7f6e94 (2026-08-14).
Data as JSON: /api/errors/60554acbd5666934.
Report an issue: GitHub.