Skip to content

Address #3801#3802

Merged
rbygrave merged 2 commits into
ebean-orm:masterfrom
dragkes:feature/resolve-nested-generic-types
Jun 30, 2026
Merged

Address #3801#3802
rbygrave merged 2 commits into
ebean-orm:masterfrom
dragkes:feature/resolve-nested-generic-types

Conversation

@dragkes

@dragkes dragkes commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Address #3801

dragkes and others added 2 commits June 29, 2026 12:45
…hierarchies

The fix introduced in ebc90e0 resolved TypeVariables only one level at a time:
mapGenerics(beanType) read only the direct generic superclass, so for a chain like
A extends B<String> / B<T> extends C<T>, processing C's fields produced an empty
map, genericTypeMap.get(TypeVariable) returned null, propertyType became null, and
AnnotationFields.readField threw an NPE calling prop.getPropertyType().isEnum().

Fix: build the full type-variable map once for the concrete bean type using
TypeResolver.getTypeVariableMap, which walks the entire superclass/interface
hierarchy and composes TypeVariable bindings transitively. The same map is passed
at every level of the recursive createProperties walk, so any TypeVariable at any
depth resolves correctly.

Type-resolution helpers (resolveType, resolveToClass, resolveCollectionTarget,
ResolvedParameterizedType) are consolidated in TypeReflectHelper so they are
shared across callers and independently testable.

Tests: TypeReflectHelperTest covers single and multi-level TypeVariable resolution
and collection-element resolution. QProductWithGenericTest adds an integration
regression test using a two-level generic chain
(ProductWithGenericMiddle extends GenericMiddleModel<Long> extends GenericBaseModel<Long>).
@rbygrave rbygrave added this to the 18.1.0 milestone Jun 30, 2026
@rbygrave rbygrave merged commit 9599512 into ebean-orm:master Jun 30, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

NPE in AnnotationFields when entity extends a generic @MappedSuperclass more than one level deep

3 participants