theonedev/onedev · error · ExplicitException

No property found with name: ${propertyNameOrDisplayName}

Error message

No property found with name: ${propertyNameOrDisplayName}

What it means

BeanDescriptor.getPropertyName resolves a property name given either the actual property name or its display name, by scanning the descriptor's property groups. When neither matches any property of the bean, it throws this ExplicitException. It is used by editable-form machinery to translate user-facing names into bean property names.

Source

Thrown at server-core/src/main/java/io/onedev/server/web/editable/BeanDescriptor.java:116

		} catch (InstantiationException | IllegalAccessException | IllegalArgumentException 
				| InvocationTargetException | NoSuchMethodException | SecurityException e) {
			throw new RuntimeException(e);
		}
	}
	
	public boolean isPropertyVisible(String propertyNameOrDisplayName) {
		return getProperty(propertyNameOrDisplayName).isPropertyVisible(new HashMap<>(), this);
	}

	public String getPropertyName(String propertyNameOrDisplayName) {
		for (List<PropertyDescriptor> groupProperties: properties.values()) {
			for (PropertyDescriptor property: groupProperties) {
				String displayName = property.getDisplayName();
				if (property.getPropertyName().equals(propertyNameOrDisplayName) || displayName.equals(propertyNameOrDisplayName))
					return property.getPropertyName();
			}
		}
		throw new ExplicitException("No property found with name: " + propertyNameOrDisplayName);
	}
	
}

View on GitHub (pinned to d44925c47c)

Solutions

  1. Print/inspect the bean's properties (e.g. via new BeanDescriptor(beanClass).getProperties()) and use the exact property name.
  2. If using a display name, confirm the @Editable(name=...) value matches exactly (case-sensitive equals).
  3. Fix typos or update the reference after a rename/upgrade.
  4. Check you are resolving against the correct bean class.

Example fix

// before
String prop = new BeanDescriptor(BuildSpec.class).getPropertyName("Cpu");
// after
String prop = new BeanDescriptor(BuildSpec.class).getPropertyName("cpu"); // exact property name or exact display name
Defensive patterns

Strategy: validation

Validate before calling

BeanDescriptor desc = new BeanDescriptor(MyBean.class);
boolean exists = desc.getProperties().stream().anyMatch(p ->
    p.getPropertyName().equals(name) || p.getDisplayName().equals(name));
if (!exists) throw new IllegalArgumentException("Unknown property: " + name);

Try / catch

try {
    String prop = beanDescriptor.getPropertyName(name);
} catch (ExplicitException e) {
    log.error("Property '{}' not found on {}; available: {}", name,
        beanClass, availablePropertyNames, e);
}

Prevention

When it happens

Trigger: Calling BeanDescriptor.getPropertyName(name) (directly or via APIs that accept a property name/display name, e.g. field ordering or scripting helpers) with a string that matches neither PropertyDescriptor.getPropertyName() nor getDisplayName() of any property in the bean class.

Common situations: Typo in a property name in configuration or script; using the display name after it was renamed in an @Editable annotation; referencing a property that exists on a different bean class; version upgrade renamed a field.

Understand the failure class

Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.

Related errors


AI-assisted analysis of theonedev/onedev@d44925c47c (2026-09-06). Data as JSON: /api/errors/9a88f669d26d1326. Report an issue: GitHub.