Skip to content

Commit d2f3439

Browse files
committed
HV-2018 Keep the interface if it is a root of the hierarchy
1 parent 0a9b39b commit d2f3439

File tree

5 files changed

+42
-8
lines changed

5 files changed

+42
-8
lines changed

engine/src/main/java/org/hibernate/validator/internal/metadata/PredefinedScopeBeanMetaDataManager.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ public PredefinedScopeBeanMetaDataManager(ConstraintCreationContext constraintCr
8888
Class<?> normalizedValidatedClass = beanMetaDataClassNormalizer.normalize( validatedClass );
8989

9090
@SuppressWarnings("unchecked")
91-
List<Class<?>> classHierarchy = (List<Class<?>>) (Object) ClassHierarchyHelper.getHierarchy( normalizedValidatedClass, Filters.excludeInterfaces() );
91+
List<Class<?>> classHierarchy = (List<Class<?>>) (Object) ClassHierarchyHelper.getHierarchy( normalizedValidatedClass,
92+
Filters.excludeInterfaces( normalizedValidatedClass ) );
9293

9394
// note that the hierarchy also contains the initial class
9495
for ( Class<?> hierarchyElement : classHierarchy ) {
@@ -200,7 +201,7 @@ private static class UninitializedBeanMetaData<T> implements BeanMetaData<T> {
200201
@SuppressWarnings("unchecked")
201202
private UninitializedBeanMetaData(Class<T> beanClass) {
202203
this.beanClass = beanClass;
203-
this.classHierarchy = (List<Class<? super T>>) (Object) ClassHierarchyHelper.getHierarchy( beanClass, Filters.excludeInterfaces() );
204+
this.classHierarchy = (List<Class<? super T>>) (Object) ClassHierarchyHelper.getHierarchy( beanClass, Filters.excludeInterfaces( beanClass ) );
204205
this.beanDescriptor = new UninitializedBeanDescriptor( beanClass );
205206
}
206207

engine/src/main/java/org/hibernate/validator/internal/metadata/aggregated/BeanMetaDataImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ else if ( constraintMetaData.getKind() == ElementKind.BEAN ) {
253253

254254
this.classHierarchyWithoutInterfaces = CollectionHelper.toImmutableList( ClassHierarchyHelper.getHierarchy(
255255
beanClass,
256-
Filters.excludeInterfaces()
256+
Filters.excludeInterfaces( beanClass )
257257
) );
258258

259259
DefaultGroupSequenceContext<? super T> defaultGroupContext = getDefaultGroupSequenceData( beanClass, defaultGroupSequence, defaultGroupSequenceProvider, validationOrderGenerator );

engine/src/main/java/org/hibernate/validator/internal/util/classhierarchy/Filters.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
public class Filters {
1616

1717
private static final Filter PROXY_FILTER = new WeldProxyFilter();
18-
private static final Filter INTERFACES_FILTER = new InterfacesFilter();
1918

2019
private Filters() {
2120
// Not allowed
@@ -26,8 +25,8 @@ private Filters() {
2625
*
2726
* @return a filter which excludes interfaces
2827
*/
29-
public static Filter excludeInterfaces() {
30-
return INTERFACES_FILTER;
28+
public static Filter excludeInterfaces(Class<?> self) {
29+
return new InterfacesFilter( self );
3130
}
3231

3332
/**
@@ -41,9 +40,15 @@ public static Filter excludeProxies() {
4140

4241
private static class InterfacesFilter implements Filter {
4342

43+
private final Class<?> self;
44+
45+
public InterfacesFilter(Class<?> self) {
46+
this.self = self;
47+
}
48+
4449
@Override
4550
public boolean accepts(Class<?> clazz) {
46-
return !clazz.isInterface();
51+
return !clazz.isInterface() || self.equals( clazz );
4752
}
4853
}
4954

engine/src/test/java/org/hibernate/validator/test/internal/engine/ValidatorTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,20 @@ public void testValidatePropertyInPresenceOfClassLevelConstraint() {
353353
);
354354
}
355355

356+
@Test
357+
public void testValidateValueConstraintOnInterface() {
358+
Validator validator = getValidator();
359+
360+
Set<ConstraintViolation<MyConstraints>> violations = validator.validateValue( MyConstraints.class, "property", null );
361+
assertThat( violations ).containsOnlyViolations(
362+
violationOf( NotNull.class ).withProperty( "property" ) );
363+
}
364+
365+
interface MyConstraints {
366+
@NotNull
367+
String getProperty();
368+
}
369+
356370
class A {
357371
@NotNull
358372
String b;

engine/src/test/java/org/hibernate/validator/test/internal/util/classhierarchy/ClassHierarchyHelperTest.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,25 @@ public void testGetHierarchy() {
3030

3131
List<Class<? super Fubar>> superClasses = ClassHierarchyHelper.getHierarchy(
3232
Fubar.class,
33-
Filters.excludeInterfaces()
33+
Filters.excludeInterfaces( Fubar.class )
3434
);
3535
assertThat( superClasses ).containsOnly( Fubar.class, Object.class );
3636
}
3737

38+
@Test
39+
public void testHierarchyWithoutInterfaces() {
40+
List<Class<? super Snafu>> superClasses = ClassHierarchyHelper.getHierarchy(
41+
Snafu.class
42+
);
43+
assertThat( superClasses ).containsOnly( Snafu.class );
44+
45+
superClasses = ClassHierarchyHelper.getHierarchy(
46+
Snafu.class,
47+
Filters.excludeInterfaces( Snafu.class )
48+
);
49+
assertThat( superClasses ).containsOnly( Snafu.class );
50+
}
51+
3852
private interface Snafu {
3953
void snafu();
4054
}

0 commit comments

Comments
 (0)