{"record":{"id":"a64bb8f28e96e87d","repo":"OtterMind/Chat2DB","slug":"database-delete-fieldname-required","errorCode":"database.delete.${fieldName}Required","errorMessage":"database.delete.${fieldName}Required","messagePattern":"database\\.delete\\.(.+?)Required","errorType":"validation","errorClass":"BusinessException","httpStatus":null,"severity":"error","filePath":"chat2db-community-server/chat2db-community-domain/chat2db-community-domain-core/src/main/java/ai/chat2db/community/domain/core/impl/db/DbDatabaseObjectDeleteServiceImpl.java","lineNumber":172,"sourceCode":"    private String requireSupportedDbType(ConnectionProfile profile) {\n        String dbType = StringUtils.upperCase(StringUtils.trimToNull(profile.getDbType()));\n        if (!SUPPORTED_TYPES.contains(dbType)) {\n            throw new BusinessException(\"database.delete.notSupportDbType\");\n        }\n        return dbType;\n    }\n\n    private void reconnectForDatabaseDelete(String dbType) {\n        if (!DatabaseTypeEnum.POSTGRESQL.name().equalsIgnoreCase(dbType)) {\n            return;\n        }\n        connectionContextService.rebindCurrentDatabase(maintenanceDatabase());\n    }\n\n    private String requireName(String name, String fieldName) {\n        String trimmed = StringUtils.trimToNull(name);\n        if (trimmed == null) {\n            throw new BusinessException(\"database.delete.\" + fieldName + \"Required\");\n        }\n        return trimmed;\n    }\n\n    private void assertDatabaseDeletionSupported(String dbType) {\n        DBConfig dbConfig = Chat2DBContext.getDBConfig(dbType);\n        if (dbConfig == null || !dbConfig.isSupportDatabase()) {\n            throw new BusinessException(\"database.delete.notSupportDatabase\");\n        }\n    }\n\n    private void rejectSystemDatabase(String dbType, String databaseName) {\n        if (DatabaseTypeEnum.MYSQL.name().equalsIgnoreCase(dbType)\n                && MYSQL_SYSTEM_DATABASES.contains(StringUtils.lowerCase(databaseName))) {\n            throw new BusinessException(\"database.delete.systemDatabaseForbidden\");\n        }\n        if (DatabaseTypeEnum.POSTGRESQL.name().equalsIgnoreCase(dbType)\n                && POSTGRESQL_SYSTEM_DATABASES.contains(StringUtils.lowerCase(databaseName))) {","sourceCodeStart":154,"sourceCodeEnd":190,"githubUrl":"https://github.com/OtterMind/Chat2DB/blob/5ee1e990e73fbcae1969dc554be254fedb3ab888/chat2db-community-server/chat2db-community-domain/chat2db-community-domain-core/src/main/java/ai/chat2db/community/domain/core/impl/db/DbDatabaseObjectDeleteServiceImpl.java#L154-L190","documentation":"Thrown by requireName() when the supplied name (databaseName or schemaName) trims to null. The code key is built dynamically: 'database.delete.' + fieldName + 'Required', yielding 'database.delete.databaseNameRequired' or 'database.delete.schemaNameRequired' (both have i18n entries).","triggerScenarios":"prepareDatabaseDelete/prepareSchemaDelete (or the execute variants) are called with a blank/null databaseName or schemaName in the request payload.","commonSituations":"Frontend sends an empty name field; path/query param not bound; client-side validation skipped before the request.","solutions":["Validate that databaseName and schemaName (where applicable) are non-blank on the client before submitting.","Add bean-validation (@NotBlank) on the request DTO so the framework rejects blanks earlier with a clear error.","Confirm the request payload field names match the DTO (databaseName/schemaName)."],"exampleFix":"// before\nprivate String requireName(String name, String fieldName) {\n  String trimmed = StringUtils.trimToNull(name);\n  if (trimmed == null) throw new BusinessException(\"database.delete.\" + fieldName + \"Required\");\n  return trimmed;\n}\n// after (DTO-level guard so it never reaches the service)\npublic class DbDatabaseDeleteRequest {\n  @NotBlank(message = \"{database.delete.databaseNameRequired}\")\n  private String databaseName;\n}","handlingStrategy":"validation","validationCode":"// DTO-level guard so blanks never reach the service\nif (StringUtils.isBlank(param.getDatabaseName())) {\n    return Result.fail(\"database.delete.databaseNameRequired\");\n}\nif (requiresSchema && StringUtils.isBlank(param.getSchemaName())) {\n    return Result.fail(\"database.delete.schemaNameRequired\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Add @NotBlank bean validation on databaseName/schemaName request fields.","Validate non-blank names on the client before submitting.","Ensure request payload field names match the DTO."],"tags":["database","delete","validation","required-field"],"backgroundTag":null,"analyzedSha":"5ee1e990e73fbcae1969dc554be254fedb3ab888","analyzedAt":"2026-08-14T07:05:03.077Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}