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
- Verify the property name against BeanUtil.getBeanDesc(beanClass).getProps() before calling get.
- Ensure the target field is either public or exposed via a getter.
- 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
- Validate field names against getBeanDesc before dynamic get.
- Use Map-backed DynaBean for arbitrary key access.
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
- No public field or set method for {}
- Invalid Getter or Setter name:
- Get value of [{}] error!
- Set value of [{}] error!
- Field [{}] not found in Class [{}]
AI-assisted analysis of chinabugotech/hutool@8870454b2a (2026-08-14).
Data as JSON: /api/errors/0c9ad046489bde27.
Report an issue: GitHub.