chinabugotech/hutool · error · BeanException

No public field or get method for {}

Error message

No public field or get method for {}

What it means

DynaBean.get looks up a PropDesc for the requested field on the wrapped bean's class. If no public field or getter exists with that name, getProp returns null and a BeanException is thrown. Map-backed DynaBeans bypass this (they read from the map), so the error is specific to POJO/class-backed beans.

Source

Thrown at hutool-core/src/main/java/cn/hutool/core/bean/DynaBean.java:107

	}
	//------------------------------------------------------------------------ Constructor end

	/**
	 * 获得字段对应值
	 *
	 * @param <T>       属性值类型
	 * @param fieldName 字段名
	 * @return 字段值
	 * @throws BeanException 反射获取属性值或字段值导致的异常
	 */
	@SuppressWarnings("unchecked")
	public <T> T get(String fieldName) throws BeanException {
		if (Map.class.isAssignableFrom(beanClass)) {
			return (T) ((Map<?, ?>) bean).get(fieldName);
		} else {
			final PropDesc prop = BeanUtil.getBeanDesc(beanClass).getProp(fieldName);
			if (null == prop) {
				throw new BeanException("No public field or get method for {}", fieldName);
			}
			return (T) prop.getValue(bean);
		}
	}

	/**
	 * 检查是否有指定名称的bean属性
	 *
	 * @param fieldName 字段名
	 * @return 是否有bean属性
	 * @since 5.4.2
	 */
	public boolean containsProp(String fieldName) {
		if (Map.class.isAssignableFrom(beanClass)) {
			return ((Map<?, ?>) bean).containsKey(fieldName);
		} else{
			return null != BeanUtil.getBeanDesc(beanClass).getProp(fieldName);
		}

View on GitHub (pinned to 8870454b2a)

Solutions

  1. Verify the property name against BeanUtil.getBeanDesc(beanClass).getProps() before calling get.
  2. Ensure the target field is either public or exposed via a getter.
  3. If using a Map-backed source, wrap a Map in DynaBean to avoid property resolution entirely.

Example fix

// before
Object v = dynaBean.get("usrName"); // typo
// after
String field = BeanUtil.getBeanDesc(bean.getClass()).getProps().stream()
    .map(PropDesc::getFieldName).filter("userName"::equals).findFirst().orElseThrow();
Object v = dynaBean.get(field);
Defensive patterns

Strategy: validation

Validate before calling

if (!BeanUtil.getBeanDesc(bean.getClass()).getProps().stream().map(PropDesc::getFieldName).collect(Collectors.toSet()).contains(name)) throw new IllegalStateException("no readable property: " + name);

Type guard

static boolean hasReadable(BeanClass c, String f) { return BeanUtil.getBeanDesc(c).getProp(f) != null; }

Try / catch

try { return dynaBean.get(name); } catch (BeanException e) { return null; }

Prevention

When it happens

Trigger: dynaBean.get("nonexistent"), get("privateField") where the field is not public and has no getter, or a typo'd field name on a class-backed DynaBean.

Common situations: Dynamic access driven by external/config-supplied field names; accessing inherited protected fields; mismatch between JSON keys and bean property names.

Related errors


AI-assisted analysis of chinabugotech/hutool@8870454b2a (2026-08-14). Data as JSON: /api/errors/0c9ad046489bde27. Report an issue: GitHub.