Skip to content

Commit 5b86f13

Browse files
committed
HV-2074 Use a custom property node name provider (if available) in the programmatic mapping
1 parent f955216 commit 5b86f13

File tree

2 files changed

+42
-9
lines changed

2 files changed

+42
-9
lines changed

engine/src/main/java/org/hibernate/validator/internal/engine/AbstractConfigurationImpl.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -384,15 +384,10 @@ public MethodValidationConfiguration getMethodValidationConfiguration() {
384384

385385
@Override
386386
public final DefaultConstraintMapping createConstraintMapping() {
387-
GetterPropertySelectionStrategy getterPropertySelectionStrategyToUse = null;
388-
if ( getterPropertySelectionStrategy == null ) {
389-
getterPropertySelectionStrategyToUse = new DefaultGetterPropertySelectionStrategy();
390-
}
391-
else {
392-
getterPropertySelectionStrategyToUse = getterPropertySelectionStrategy;
393-
}
394-
395-
return new DefaultConstraintMapping( new JavaBeanHelper( getterPropertySelectionStrategyToUse, defaultPropertyNodeNameProvider ) );
387+
return new DefaultConstraintMapping( new JavaBeanHelper(
388+
getterPropertySelectionStrategy == null ? new DefaultGetterPropertySelectionStrategy() : getterPropertySelectionStrategy,
389+
validationBootstrapParameters.getPropertyNodeNameProvider() == null ? defaultPropertyNodeNameProvider : validationBootstrapParameters.getPropertyNodeNameProvider()
390+
) );
396391
}
397392

398393
@Override

engine/src/test/java/org/hibernate/validator/test/spi/nodenameprovider/PropertyNodeNameProviderTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
*/
55
package org.hibernate.validator.test.spi.nodenameprovider;
66

7+
import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertThat;
8+
import static org.hibernate.validator.testutil.ConstraintViolationAssert.violationOf;
79
import static org.testng.Assert.assertEquals;
810

911
import java.lang.annotation.ElementType;
@@ -23,6 +25,9 @@
2325
import jakarta.validation.constraints.Size;
2426

2527
import org.hibernate.validator.HibernateValidator;
28+
import org.hibernate.validator.HibernateValidatorConfiguration;
29+
import org.hibernate.validator.cfg.ConstraintMapping;
30+
import org.hibernate.validator.cfg.defs.SizeDef;
2631
import org.hibernate.validator.testutil.TestForIssue;
2732

2833
import org.testng.annotations.BeforeMethod;
@@ -177,6 +182,30 @@ public void hibernateValidatorFallsBackToDefaultPropertyNodeNameProvider() {
177182
assertEquals( violation.getPropertyPath().toString(), "brand.name" );
178183
}
179184

185+
@Test
186+
public void constraintsDefinedProgrammatically() {
187+
HibernateValidatorConfiguration configuration = Validation.byProvider( HibernateValidator.class )
188+
.configure()
189+
.propertyNodeNameProvider( new AnnotationPropertyNodeNameProvider( PropertyName.class ) );
190+
ConstraintMapping constraintMapping = configuration.createConstraintMapping();
191+
192+
constraintMapping
193+
.type( ProgrammaticCar.class )
194+
.field( "brand" )
195+
.constraint( new SizeDef().min( 5 ).max( 50 ) );
196+
197+
ValidatorFactory validatorFactory = configuration
198+
.addMapping( constraintMapping )
199+
.buildValidatorFactory();
200+
201+
Validator val = validatorFactory.getValidator();
202+
203+
assertThat( val.validate( new ProgrammaticCar( INVALID_BRAND_NAME ) ) )
204+
.containsOnlyViolations( violationOf( Size.class )
205+
.withProperty( "car_brand" ) );
206+
207+
}
208+
180209
@Retention(RetentionPolicy.RUNTIME)
181210
@Target({ ElementType.FIELD, ElementType.METHOD })
182211
public @interface PropertyName {
@@ -237,4 +266,13 @@ public Airplane(Engine engine) {
237266
this.engine = engine;
238267
}
239268
}
269+
270+
private static class ProgrammaticCar {
271+
@PropertyName("car_brand")
272+
public final String brand;
273+
274+
ProgrammaticCar(String brand) {
275+
this.brand = brand;
276+
}
277+
}
240278
}

0 commit comments

Comments
 (0)