{"record":{"id":"f3f510943d9ac8c9","repo":"dromara/Sa-Token","slug":"12001","errorCode":"12001","errorMessage":"缺少参数：\" + name","messagePattern":"缺少参数：\" \\+ name","errorType":"validation","errorClass":"SaTokenException","httpStatus":null,"severity":"warning","filePath":"sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaRequest.java","lineNumber":89,"sourceCode":"\n\t/**\n\t * 在 [ 请求体 ] 里检测请求是否提供了指定参数\n\t * @param name 参数名称 \n\t * @return 是否提供 \n\t */\n\tdefault boolean hasParam(String name) {\n\t\t return SaFoxUtil.isNotEmpty(getParam(name));\n\t}\n\t\n\t/**\n\t * 在 [ 请求体 ] 里获取一个值 （此值必须存在，否则抛出异常 ）\n\t * @param name 键\n\t * @return 参数值 \n\t */\n\tdefault String getParamNotNull(String name) {\n\t\tString paramValue = getParam(name);\n\t\tif(SaFoxUtil.isEmpty(paramValue)) {\n\t\t\tthrow new SaTokenException(\"缺少参数：\" + name).setCode(SaErrorCode.CODE_12001);\n\t\t}\n\t\treturn paramValue;\n\t}\n\n\t/**\n\t * 获取 [ 请求体 ] 里提交的所有参数名称\n\t * @return 参数名称列表\n\t */\n\tCollection<String> getParamNames();\n\n\t/**\n\t * 获取 [ 请求体 ] 里提交的所有参数\n\t * @return 参数列表\n\t */\n\tMap<String, String> getParamMap();\n\n\t/**\n\t * 在 [ 请求头 ] 里获取一个值 ","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/dromara/Sa-Token/blob/ac2c7f6e94a78573cf0bcb932dd8b04e68fad189/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaRequest.java#L71-L107","documentation":"SaRequest.getParamNotNull(name) is the interface-level required-parameter accessor: it fetches a request parameter and throws code 12001 when the value is null or empty. The exception names the missing parameter, making it a controlled bad-request signal rather than an infrastructure failure.","triggerScenarios":"Custom controller/filter code calling SaHolder.getRequest().getParamNotNull(\"ticket\") when the client omitted the parameter or sent an empty value; SSO/login endpoints requiring a param that the redirecting client did not append.","commonSituations":"Clients calling the API with a different parameter name (camelCase vs snake_case), form bodies missing fields, query strings dropped by a gateway rewrite, or frontend deploying one version ahead of backend.","solutions":["Send the named parameter with a non-empty value in the request (query string, form body, or multipart as your framework binds)","In your code, prefer checking hasParam(name) first to return a friendly 400 message instead of the raw exception","Align parameter names across frontend/backend with a shared contract or constant"],"exampleFix":"// before\nString ticket = SaHolder.getRequest().getParamNotNull(\"ticket\"); // 500-style exception if absent\n\n// after\nSaRequest req = SaHolder.getRequest();\nif (!req.hasParam(\"ticket\")) {\n    return SaResult.error(\"missing parameter: ticket\");\n}\nString ticket = req.getParamNotNull(\"ticket\");","handlingStrategy":"validation","validationCode":"SaRequest req = SaHolder.getRequest();\nif (!req.hasParam(\"ticket\")) {\n    return SaResult.error(\"missing parameter: ticket\");\n}\nString ticket = req.getParamNotNull(\"ticket\");","typeGuard":null,"tryCatchPattern":"try {\n    String v = req.getParamNotNull(\"name\");\n} catch (SaTokenException e) {\n    if (SaErrorCode.CODE_12001 == e.getCode()) { /* map to 400 response */ }\n}","preventionTips":["Prefer hasParam() + explicit 400 over getParamNotNull at API edges","Share parameter-name constants between client and server","Contract-test critical endpoints for required params"],"tags":["sa-token","request","parameter","bad-request","validation"],"backgroundTag":null,"analyzedSha":"ac2c7f6e94a78573cf0bcb932dd8b04e68fad189","analyzedAt":"2026-08-14T14:36:10.271Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}