{"record":{"id":"dc9c620fca2bfc32","repo":"theonedev/onedev","slug":"invalid-property-path","errorCode":null,"errorMessage":"Invalid property path.","messagePattern":"Invalid property path\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"server-core/src/main/java/org/hibernate/validator/internal/engine/ValidatorImpl.java","lineNumber":367,"sourceCode":"\n\t@Override\n\tpublic ExecutableValidator forExecutables() {\n\t\treturn this;\n\t}\n\n\tprivate ValidationContextBuilder getValidationContextBuilder() {\n\t\treturn new ValidationContextBuilder(\n\t\t\t\tconstraintValidatorManager,\n\t\t\t\tconstraintValidatorFactory,\n\t\t\t\tvalidatorScopedContext,\n\t\t\t\tTraversableResolvers.wrapWithCachingForSingleValidation( traversableResolver, validatorScopedContext.isTraversableResolverResultCacheEnabled() ),\n\t\t\t\tconstraintValidatorInitializationContext\n\t\t);\n\t}\n\n\tprivate void sanityCheckPropertyPath(String propertyName) {\n\t\tif ( propertyName == null || propertyName.length() == 0 ) {\n\t\t\tthrow LOG.getInvalidPropertyPathException();\n\t\t}\n\t}\n\n\tprivate void sanityCheckGroups(Class<?>[] groups) {\n\t\tContracts.assertNotNull( groups, MESSAGES.groupMustNotBeNull() );\n\t\tfor ( Class<?> clazz : groups ) {\n\t\t\tif ( clazz == null ) {\n\t\t\t\tthrow new IllegalArgumentException( MESSAGES.groupMustNotBeNull() );\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate ValidationOrder determineGroupValidationOrder(Class<?>[] groups) {\n\t\tCollection<Class<?>> resultGroups;\n\t\t// if no groups is specified use the default\n\t\tif ( groups.length == 0 ) {\n\t\t\tresultGroups = DEFAULT_GROUPS;\n\t\t}","sourceCodeStart":349,"sourceCodeEnd":385,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/org/hibernate/validator/internal/engine/ValidatorImpl.java#L349-L385","documentation":"Before validating a property, ValidatorImpl.sanityCheckPropertyPath rejects a null or empty property name, since Bean Validation requires a concrete property path. Passing null or \"\" to validateProperty/validateValue throws \"Invalid property path.\" (IllegalArgumentException).","triggerScenarios":"Calling validateProperty(bean, null) or validateValue(cls, \"\", value); commonly when the property name is derived dynamically from a variable that is unset or blank.","commonSituations":"Reflection-based frameworks building validation calls from metadata where the field name is missing; user-supplied property names that were never validated; empty config keys.","solutions":["Ensure the property name is non-null and non-empty before calling validateProperty/validateValue","Trim and check dynamic property strings at the source","If the intent was to validate everything, use validate(bean) instead of a property path"],"exampleFix":"// before\nvalidator.validateProperty(user, cfg.getPropertyName());\n// after\nString prop = cfg.getPropertyName();\nif (prop != null && !prop.trim().isEmpty()) {\n    validator.validateProperty(user, prop.trim());\n}","handlingStrategy":"validation","validationCode":"if (propertyName == null || propertyName.isEmpty()) throw new IllegalArgumentException(\"propertyName required\");","typeGuard":"boolean isValidPropertyPath(String p) { return p != null && !p.trim().isEmpty(); }","tryCatchPattern":"try { validator.validateProperty(bean, prop); } catch (IllegalArgumentException e) { throw new BadRequestException(\"Invalid property path: \" + prop, e); }","preventionTips":["Validate dynamic property names at the source (config/annotations)","Default to whole-bean validation when no specific property is given"],"tags":["hibernate-validator","bean-validation","property-path","illegal-argument"],"backgroundTag":"missing-required-argument","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}