hibernate/hibernate-orm · error · IllegalStateException

no object key available

Error message

no object key available

What it means

OsonDocumentReader.getObjectKeyName() returns the current key name only right after the parser produced a KEY_NAME event (mapped to JsonDocumentItemType.VALUE_KEY): next() resets currentKeyName to null and only the KEY_NAME branch sets it. Calling the accessor at any other position in the iteration throws IllegalStateException 'no object key available'.

Solutions

  1. Only call getObjectKeyName() immediately after next() returned the object-key item type
  2. Track the last returned JsonDocumentItemType in your loop and gate key/value accessors on it
  3. Read payloads via the typed getters (getStringValue/getBigDecimalValue/...) only after VALUE items

Example fix

// before
reader.next();
String key = reader.getObjectKeyName(); // throws if last item was not a key

// after
if (reader.next() == JsonDocumentItemType.VALUE_KEY) {
    String key = reader.getObjectKeyName();
}
Defensive patterns

Strategy: validation

Validate before calling

JsonDocumentItemType last = null;
while (reader.hasNext()) {
    last = reader.next();
    if (last == JsonDocumentItemType.VALUE_KEY) {
        String key = reader.getObjectKeyName(); // only valid here
    }
}

Prevention

When it happens

Trigger: Calling getObjectKeyName() when the last next() returned anything other than the key item type - e.g. while iterating array elements, before the first next(), or after consuming the key and its value.

Common situations: Custom adapters or integration code driving JsonDocumentReader; porting Jackson-style code where field names are always available; test harnesses that call accessors eagerly.

Related errors


AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22). Data as JSON: /api/errors/305754aba9507b3a. Report an issue: GitHub.

Appendix: source

Thrown at hibernate-core/src/main/java/org/hibernate/type/format/OsonDocumentReader.java:109

				return JsonDocumentItemType.VALUE;
			case VALUE_DOUBLE:
				currentValue = this.parser.getDouble();
				return JsonDocumentItemType.VALUE;
			case VALUE_FLOAT:
				currentValue = this.parser.getFloat();
				return JsonDocumentItemType.VALUE;
			case VALUE_BINARY:
				currentValue = this.parser.getBytes();
				return JsonDocumentItemType.VALUE;
			default :
				throw new IllegalStateException( "Unknown OSON event: " + evt );
		}
	}

	@Override
	public String getObjectKeyName() {
		if (currentKeyName == null)
			throw new IllegalStateException("no object key available");
		return currentKeyName;
	}

	@Override
	public String getStringValue() {
		return (String)currentValue;
	}

	@Override
	public BigDecimal getBigDecimalValue() {
		return (BigDecimal)currentValue;
	}

	@Override
	public BigInteger getBigIntegerValue() {
		return ((BigDecimal)currentValue).toBigInteger();
	}

View on GitHub (pinned to fad1729dce)