{"record":{"id":"1509049c168e1a77","repo":"YunaiV/ruoyi-vue-pro","slug":"error","errorCode":null,"errorMessage":"未知的数据类型：{}","messagePattern":"未知的数据类型：(.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java","lineNumber":149,"sourceCode":"\n    private Long parseTenantId(Message<?> message) {\n        Object tenantId = message.getHeaders().get(HEADER_TENANT_ID);\n        if (tenantId == null) {\n            return null;\n        }\n        if (tenantId instanceof Long) {\n            return (Long) tenantId;\n        }\n        if (tenantId instanceof Number) {\n            return ((Number) tenantId).longValue();\n        }\n        if (tenantId instanceof String) {\n            return Long.parseLong((String) tenantId);\n        }\n        if (tenantId instanceof byte[]) {\n            return Long.parseLong(new String((byte[]) tenantId));\n        }\n        throw new IllegalArgumentException(\"未知的数据类型：\" + tenantId);\n    }\n\n    /**\n     * Get the method argument values for the current message, checking the provided\n     * argument values and falling back to the configured argument resolvers.\n     * <p>The resulting array will be passed into {@link #doInvoke}.\n     * @since 5.1.2\n     */\n    protected Object[] getMethodArgumentValues(Message<?> message, Object... providedArgs) throws Exception {\n        MethodParameter[] parameters = getMethodParameters();\n        if (ObjectUtils.isEmpty(parameters)) {\n            return EMPTY_ARGS;\n        }\n\n        Object[] args = new Object[parameters.length];\n        for (int i = 0; i < parameters.length; i++) {\n            MethodParameter parameter = parameters[i];\n            parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);","sourceCodeStart":131,"sourceCodeEnd":167,"githubUrl":"https://github.com/YunaiV/ruoyi-vue-pro/blob/0418084e222612af2fc1141f566af454f9236ab1/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java#L131-L167","documentation":"This is a patched Spring InvocableHandlerMethod that resolves a tenantId argument from a message header. It handles Long, Number, String, and byte[]; any other type (e.g. an Integer[] return, a Map, a JSON object, or a deserialized custom type) hits the else and throws IllegalArgumentException. It indicates the message header carried a value of an unsupported Java type.","triggerScenarios":"A messaging (WebSocket/STOMP/Simp) handler declares a Long tenantId parameter but the incoming message header contains a non-convertible type (a JSON object, a list, an Integer array, or a boolean). Serializer config mismatch between client and server.","commonSituations":"Client sends tenant as a JSON object/array instead of a scalar; a message converter that deserializes headers into POJOs; protocol upgrade where the tenant header format changed.","solutions":["Ensure the client sends the tenant id header as a plain string or number scalar.","Align the message converter so headers stay as String/Long rather than nested objects.","If a wider type set is expected, extend the patched conversion to handle the additional type safely."],"exampleFix":"// before: client sends tenant as object header {\"tenantId\":{\"v\":1}}\n// after: send a scalar string header\ntenantId: \"1\"","handlingStrategy":"type-guard","validationCode":"Object h = message.getHeaders().get(\"tenantId\");\nif (!(h instanceof Long || h instanceof Number || h instanceof String || h instanceof byte[]))\n    throw new IllegalArgumentException(\"tenantId header must be scalar, got \" + h.getClass());","typeGuard":"static boolean isSupportedTenantType(Object v) { return v instanceof Long || v instanceof Number || v instanceof String || v instanceof byte[]; }","tryCatchPattern":"try { return convertTenantId(header); }\ncatch (IllegalArgumentException e) { rejectMessage(\"unsupported tenantId type\"); return null; }","preventionTips":["Send tenantId as a scalar string header from clients","Keep message converters consistent client/server","Extend the patched converter only with safe, well-defined types"],"tags":["spring","messaging","tenant","type-conversion"],"backgroundTag":null,"analyzedSha":"0418084e222612af2fc1141f566af454f9236ab1","analyzedAt":"2026-08-14T00:56:18.412Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}