{"record":{"id":"a29799f4f889b8af","repo":"apache/dolphinscheduler","slug":"jdbcregistrydata-is-invalidated","errorCode":null,"errorMessage":"jdbcRegistryData:  is invalidated","messagePattern":"jdbcRegistryData:  is invalidated","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/model/DTO/JdbcRegistryDataChangeEventDTO.java","lineNumber":56,"sourceCode":"\n    private EventType eventType;\n\n    private JdbcRegistryDataDTO jdbcRegistryData;\n\n    private Date createTime;\n\n    public enum EventType {\n        ADD,\n        UPDATE,\n        DELETE;\n\n    }\n\n    public static JdbcRegistryDataChangeEventDTO fromJdbcRegistryDataChangeEvent(JdbcRegistryDataChangeEvent jdbcRegistryDataChangeEvent) {\n        JdbcRegistryData jdbcRegistryData =\n                JSONUtils.parseObject(jdbcRegistryDataChangeEvent.getJdbcRegistryData(), JdbcRegistryData.class);\n        if (jdbcRegistryData == null) {\n            throw new IllegalArgumentException(\n                    \"jdbcRegistryData: \" + jdbcRegistryDataChangeEvent.getJdbcRegistryData() + \" is invalidated\");\n        }\n        return JdbcRegistryDataChangeEventDTO.builder()\n                .id(jdbcRegistryDataChangeEvent.getId())\n                .jdbcRegistryData(JdbcRegistryDataDTO.fromJdbcRegistryData(jdbcRegistryData))\n                .eventType(EventType.valueOf(jdbcRegistryDataChangeEvent.getEventType()))\n                .createTime(jdbcRegistryDataChangeEvent.getCreateTime())\n                .build();\n    }\n\n    public static JdbcRegistryDataChangeEvent toJdbcRegistryDataChangeEvent(JdbcRegistryDataChangeEventDTO jdbcRegistryDataChangeEvent) {\n        return JdbcRegistryDataChangeEvent.builder()\n                .id(jdbcRegistryDataChangeEvent.getId())\n                .jdbcRegistryData(JSONUtils.toJsonString(jdbcRegistryDataChangeEvent.getJdbcRegistryData()))\n                .eventType(jdbcRegistryDataChangeEvent.getEventType().name())\n                .createTime(jdbcRegistryDataChangeEvent.getCreateTime())\n                .build();\n    }","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/apache/dolphinscheduler/blob/02eac45a1b6676e639fcbfb4be2243de5771b05d/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/model/DTO/JdbcRegistryDataChangeEventDTO.java#L38-L74","documentation":"JdbcRegistryDataChangeEventDTO.fromJdbcRegistryDataChangeEvent parses the JSON payload of a change event into a JdbcRegistryData object; if JSONUtils.parseObject returns null (invalid or empty JSON), the DTO cannot be built and this IllegalArgumentException is thrown. It is a guard against corrupted or unparsable event data flowing through the JDBC registry's notification channel.","triggerScenarios":"A JdbcRegistryDataChangeEvent whose getJdbcRegistryData() returns null, empty, or non-JSON text; JSON that parses to null under the fastjson configuration used by JSONUtils; corrupted rows in the jdbc registry data table broadcast as change events.","commonSituations":"Database rows edited manually or truncated by column-size limits, version mismatch where the serialized JdbcRegistryData JSON schema changed, and consumers replaying old or malformed event records.","solutions":["Inspect the offending event's raw JSON string (included in the message) and fix or delete the corrupted row/event","Verify the JSON serialization format matches the current JdbcRegistryData class version","Add validation at write time so only valid JdbcRegistryData JSON is persisted"],"exampleFix":"// before\nJdbcRegistryData data = JSONUtils.parseObject(event.getJdbcRegistryData(), JdbcRegistryData.class);\n// after\nif (StringUtils.isBlank(event.getJdbcRegistryData())) {\n    log.warn(\"Skipping invalid change event: {}\", event.getId());\n    return;\n}\nJdbcRegistryData data = JSONUtils.parseObject(event.getJdbcRegistryData(), JdbcRegistryData.class);","handlingStrategy":"try-catch","validationCode":"String raw = event.getJdbcRegistryData(); if (raw == null || raw.isEmpty() || !raw.trim().startsWith(\"{\")) { skip(event); }","typeGuard":null,"tryCatchPattern":"try { dto = JdbcRegistryDataChangeEventDTO.fromJdbcRegistryDataChangeEvent(event); } catch (IllegalArgumentException e) { log.error(\"Corrupt event {}: {}\", event.getId(), e.getMessage()); }","preventionTips":["Validate JSON before persisting JdbcRegistryData rows","Keep serialization library/config consistent across versions","Monitor consumer logs for repeated corrupt-event warnings"],"tags":["json","serialization","registry"],"backgroundTag":"json-unmarshal-failed","analyzedSha":"02eac45a1b6676e639fcbfb4be2243de5771b05d","analyzedAt":"2026-09-06T17:43:00.555Z","contentChangedAt":"2026-09-06T17:43:00.555Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}