Skip to content

Commit b4808e7

Browse files
committed
HV-2031 Add a config knob to predefined configuration
so that we can get the "old-default" behavior by-default and enable the additional collection of information from the XML metadata
1 parent faa7cc0 commit b4808e7

File tree

5 files changed

+65
-7
lines changed

5 files changed

+65
-7
lines changed

engine/src/main/java/org/hibernate/validator/PredefinedScopeHibernateValidatorConfiguration.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,17 @@ public interface PredefinedScopeHibernateValidatorConfiguration extends BaseHibe
3232
@Incubating
3333
@Deprecated
3434
PredefinedScopeHibernateValidatorConfiguration initializeLocales(Set<Locale> locales);
35+
36+
/**
37+
* Specify whether to append the {@link #builtinConstraints(Set) built-in constraints} and {@link #initializeBeanMetaData(Set) beans to initialize}
38+
* with constraints and beans provided only through XML mapping.
39+
* <p>
40+
* This option is enabled by default.
41+
*
42+
* @param include Whether to include the beans defined only in xml as part of the {@link #initializeBeanMetaData(Set) set of beans to initialize}
43+
* and also add built-in constraints used only in xml definitions as part of the {@link #builtinConstraints(Set) set of built-in constraints}.
44+
* @return {@code this} for chaining configuration method calls.
45+
*/
46+
@Incubating
47+
PredefinedScopeHibernateValidatorConfiguration includeBeansAndConstraintsDefinedOnlyInXml(boolean include);
3548
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public class PredefinedScopeConfigurationImpl extends AbstractConfigurationImpl<
3030

3131
private Set<Class<?>> beanClassesToInitialize;
3232

33+
private boolean includeBeansAndConstraintsDefinedOnlyInXml = true;
34+
3335
public PredefinedScopeConfigurationImpl(BootstrapState state) {
3436
super( state );
3537
}
@@ -58,6 +60,10 @@ public Set<Class<?>> getBeanClassesToInitialize() {
5860
return beanClassesToInitialize;
5961
}
6062

63+
public boolean isIncludeBeansAndConstraintsDefinedOnlyInXml() {
64+
return includeBeansAndConstraintsDefinedOnlyInXml;
65+
}
66+
6167
@Override
6268
@Deprecated
6369
public PredefinedScopeHibernateValidatorConfiguration initializeLocales(Set<Locale> localesToInitialize) {
@@ -66,6 +72,12 @@ public PredefinedScopeHibernateValidatorConfiguration initializeLocales(Set<Loca
6672
return thisAsT();
6773
}
6874

75+
@Override
76+
public PredefinedScopeHibernateValidatorConfiguration includeBeansAndConstraintsDefinedOnlyInXml(boolean include) {
77+
this.includeBeansAndConstraintsDefinedOnlyInXml = include;
78+
return thisAsT();
79+
}
80+
6981
@Override
7082
protected boolean preloadResourceBundles() {
7183
return true;

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,9 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
147147
this.propertyNodeNameProvider = ValidatorFactoryConfigurationHelper.determinePropertyNodeNameProvider( hibernateSpecificConfig, properties, externalClassLoader );
148148

149149
this.valueExtractorManager = new ValueExtractorManager( configurationState.getValueExtractors() );
150-
ConstraintHelper constraintHelper = ConstraintHelper.forBuiltinConstraints( hibernateSpecificConfig.getBuiltinConstraints() );
150+
ConstraintHelper constraintHelper = ConstraintHelper.forBuiltinConstraints(
151+
hibernateSpecificConfig.getBuiltinConstraints(),
152+
hibernateSpecificConfig.isIncludeBeansAndConstraintsDefinedOnlyInXml() );
151153
TypeResolutionHelper typeResolutionHelper = new TypeResolutionHelper();
152154

153155
ConstraintCreationContext constraintCreationContext = new ConstraintCreationContext( constraintHelper,
@@ -194,7 +196,9 @@ public PredefinedScopeValidatorFactoryImpl(ConfigurationState configurationState
194196
XmlMetaDataProvider xmlMetaDataProvider;
195197
if ( mappingParser != null && mappingParser.createConstrainedElements() ) {
196198
xmlMetaDataProvider = new XmlMetaDataProvider( mappingParser );
197-
beanClassesToInitialize.addAll( xmlMetaDataProvider.configuredBeanClasses() );
199+
if ( hibernateSpecificConfig.isIncludeBeansAndConstraintsDefinedOnlyInXml() ) {
200+
beanClassesToInitialize.addAll( xmlMetaDataProvider.configuredBeanClasses() );
201+
}
198202
}
199203
else {
200204
xmlMetaDataProvider = null;

engine/src/main/java/org/hibernate/validator/internal/metadata/core/ConstraintHelper.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -400,8 +400,14 @@ public static ConstraintHelper forAllBuiltinConstraints() {
400400
return new StaticConstraintHelper();
401401
}
402402

403-
public static ConstraintHelper forBuiltinConstraints(Set<String> enabledConstraints) {
404-
return new DynamicConstraintHelper( BuiltinConstraint.resolve( enabledConstraints ) );
403+
public static ConstraintHelper forBuiltinConstraints(Set<String> enabledConstraints, boolean attemptToResolveMissingBuiltInConstraintsOnTheFly) {
404+
Set<BuiltinConstraint> builtinConstraints = BuiltinConstraint.resolve( enabledConstraints );
405+
if ( attemptToResolveMissingBuiltInConstraintsOnTheFly ) {
406+
return new DynamicConstraintHelper( builtinConstraints );
407+
}
408+
else {
409+
return new StaticConstraintHelper( builtinConstraints );
410+
}
405411
}
406412

407413
@SuppressWarnings("deprecation")
@@ -1154,7 +1160,11 @@ private static class StaticConstraintHelper extends ConstraintHelper {
11541160
private final Map<Class<? extends Annotation>, List<? extends ConstraintValidatorDescriptor<?>>> enabledBuiltinConstraints;
11551161

11561162
private StaticConstraintHelper() {
1157-
this.enabledBuiltinConstraints = Collections.unmodifiableMap( resolve( new HashSet<>( Arrays.asList( BuiltinConstraint.values() ) ) ) );
1163+
this( new HashSet<>( Arrays.asList( BuiltinConstraint.values() ) ) );
1164+
}
1165+
1166+
private StaticConstraintHelper(Set<BuiltinConstraint> builtinConstraints) {
1167+
this.enabledBuiltinConstraints = Collections.unmodifiableMap( resolve( builtinConstraints ) );
11581168
}
11591169

11601170
@SuppressWarnings("unchecked")

engine/src/test/java/org/hibernate/validator/test/predefinedscope/PredefinedScopeValidatorFactoryTest.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,27 @@ public String interpolate(String messageTemplate, Context context) {
330330
}
331331

332332
@Test
333-
public void testXmlDefinedConstraints() {
333+
public void testXmlDefinedConstraintsDiscoveryDisabled() {
334+
// we assume that all the metadata is defined in the xml,
335+
// hence there is no built-in constraints nor beans to init,
336+
// But we also do not ask HV to append the sets with the beans from XMLs or built-in constraints:
337+
try (
338+
ValidatorFactory factory = Validation.byProvider( PredefinedScopeHibernateValidator.class )
339+
.configure()
340+
.builtinConstraints( Collections.emptySet() )
341+
.initializeBeanMetaData( Collections.emptySet() )
342+
.includeBeansAndConstraintsDefinedOnlyInXml( false )
343+
.addMapping( PredefinedScopeValidatorFactoryTest.class.getResourceAsStream( "constraints-simplexmlbean.xml" ) )
344+
.buildValidatorFactory()
345+
) {
346+
Validator validator = factory.getValidator();
347+
// Because all the metadata for this bean was in the XML, and we ignore it:
348+
assertNoViolations( validator.validate( new SimpleXmlBean() ) );
349+
}
350+
}
351+
352+
@Test
353+
public void testXmlDefinedConstraintsDiscoveryEnabled() {
334354
// we assume that all the metadata is defined in the xml,
335355
// hence there is no built-in constraints nor beans to init:
336356
try (
@@ -349,7 +369,6 @@ public void testXmlDefinedConstraints() {
349369
violationOf( NotNull.class ).withMessage( "must not be null" )
350370
);
351371
}
352-
353372
}
354373

355374
private static ValidatorFactory getValidatorFactory() {

0 commit comments

Comments
 (0)