Skip to content

Commit 9464463

Browse files
committed
HV-1694 Reduce memory allocation for unconstrained beans
1 parent c7f372c commit 9464463

File tree

2 files changed

+42
-34
lines changed

2 files changed

+42
-34
lines changed

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

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,15 @@ public final <T> Set<ConstraintViolation<T>> validate(T object, Class<?>... grou
151151
Contracts.assertNotNull( object, MESSAGES.validatedObjectMustNotBeNull() );
152152
sanityCheckGroups( groups );
153153

154-
BaseBeanValidationContext<T> validationContext = getValidationContextBuilder().forValidate( object );
154+
@SuppressWarnings("unchecked")
155+
Class<T> rootBeanClass = (Class<T>) object.getClass();
156+
BeanMetaData<T> rootBeanMetaData = beanMetaDataManager.getBeanMetaData( rootBeanClass );
157+
158+
if ( !rootBeanMetaData.hasConstraints() ) {
159+
return Collections.emptySet();
160+
}
161+
162+
BaseBeanValidationContext<T> validationContext = getValidationContextBuilder().forValidate( rootBeanClass, rootBeanMetaData, object );
155163

156164
if ( !validationContext.getRootBeanMetaData().hasConstraints() ) {
157165
return Collections.emptySet();
@@ -174,13 +182,18 @@ public final <T> Set<ConstraintViolation<T>> validateProperty(T object, String p
174182
sanityCheckPropertyPath( propertyName );
175183
sanityCheckGroups( groups );
176184

177-
PathImpl propertyPath = PathImpl.createPathFromString( propertyName );
178-
BaseBeanValidationContext<T> validationContext = getValidationContextBuilder().forValidateProperty( object, propertyPath );
185+
@SuppressWarnings("unchecked")
186+
Class<T> rootBeanClass = (Class<T>) object.getClass();
187+
BeanMetaData<T> rootBeanMetaData = beanMetaDataManager.getBeanMetaData( rootBeanClass );
179188

180-
if ( !validationContext.getRootBeanMetaData().hasConstraints() ) {
189+
if ( !rootBeanMetaData.hasConstraints() ) {
181190
return Collections.emptySet();
182191
}
183192

193+
PathImpl propertyPath = PathImpl.createPathFromString( propertyName );
194+
BaseBeanValidationContext<T> validationContext = getValidationContextBuilder().forValidateProperty( rootBeanClass, rootBeanMetaData, object,
195+
propertyPath );
196+
184197
BeanValueContext<?, Object> valueContext = getValueContextForPropertyValidation( validationContext, propertyPath );
185198

186199
if ( valueContext.getCurrentBean() == null ) {
@@ -198,13 +211,15 @@ public final <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, St
198211
sanityCheckPropertyPath( propertyName );
199212
sanityCheckGroups( groups );
200213

201-
PathImpl propertyPath = PathImpl.createPathFromString( propertyName );
202-
BaseBeanValidationContext<T> validationContext = getValidationContextBuilder().forValidateValue( beanType, propertyPath );
214+
BeanMetaData<T> rootBeanMetaData = beanMetaDataManager.getBeanMetaData( beanType );
203215

204-
if ( !validationContext.getRootBeanMetaData().hasConstraints() ) {
216+
if ( !rootBeanMetaData.hasConstraints() ) {
205217
return Collections.emptySet();
206218
}
207219

220+
PathImpl propertyPath = PathImpl.createPathFromString( propertyName );
221+
BaseBeanValidationContext<T> validationContext = getValidationContextBuilder().forValidateValue( beanType, rootBeanMetaData, propertyPath );
222+
208223
ValidationOrder validationOrder = determineGroupValidationOrder( groups );
209224

210225
return validateValueInContext(
@@ -251,7 +266,13 @@ public <T> Set<ConstraintViolation<T>> validateReturnValue(T object, Method meth
251266
private <T> Set<ConstraintViolation<T>> validateParameters(T object, Executable executable, Object[] parameterValues, Class<?>... groups) {
252267
sanityCheckGroups( groups );
253268

269+
@SuppressWarnings("unchecked")
270+
Class<T> rootBeanClass = object != null ? (Class<T>) object.getClass() : (Class<T>) executable.getDeclaringClass();
271+
BeanMetaData<T> rootBeanMetaData = beanMetaDataManager.getBeanMetaData( rootBeanClass );
272+
254273
ExecutableValidationContext<T> validationContext = getValidationContextBuilder().forValidateParameters(
274+
rootBeanClass,
275+
rootBeanMetaData,
255276
object,
256277
executable,
257278
parameterValues
@@ -271,7 +292,14 @@ private <T> Set<ConstraintViolation<T>> validateParameters(T object, Executable
271292
private <T> Set<ConstraintViolation<T>> validateReturnValue(T object, Executable executable, Object returnValue, Class<?>... groups) {
272293
sanityCheckGroups( groups );
273294

295+
@SuppressWarnings("unchecked")
296+
Class<T> rootBeanClass = object != null ? (Class<T>) object.getClass() : (Class<T>) executable.getDeclaringClass();
297+
BeanMetaData<T> rootBeanMetaData = beanMetaDataManager.getBeanMetaData( rootBeanClass );
298+
299+
274300
ExecutableValidationContext<T> validationContext = getValidationContextBuilder().forValidateReturnValue(
301+
rootBeanClass,
302+
rootBeanMetaData,
275303
object,
276304
executable,
277305
returnValue
@@ -312,13 +340,11 @@ public ExecutableValidator forExecutables() {
312340

313341
private ValidationContextBuilder getValidationContextBuilder() {
314342
return new ValidationContextBuilder(
315-
beanMetaDataManager,
316343
constraintValidatorManager,
317344
constraintValidatorFactory,
318345
validatorScopedContext,
319346
TraversableResolvers.wrapWithCachingForSingleValidation( traversableResolver, validatorScopedContext.isTraversableResolverResultCacheEnabled() ),
320347
constraintValidatorInitializationContext
321-
322348
);
323349
}
324350

engine/src/main/java/org/hibernate/validator/internal/engine/validationcontext/ValidationContextBuilder.java

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorInitializationContext;
1515
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager;
1616
import org.hibernate.validator.internal.engine.path.PathImpl;
17-
import org.hibernate.validator.internal.metadata.BeanMetaDataManager;
1817
import org.hibernate.validator.internal.metadata.aggregated.BeanMetaData;
1918

2019
/**
@@ -25,33 +24,26 @@
2524
*/
2625
public class ValidationContextBuilder {
2726

28-
private final BeanMetaDataManager beanMetaDataManager;
2927
private final ConstraintValidatorManager constraintValidatorManager;
3028
private final ConstraintValidatorFactory constraintValidatorFactory;
3129
private final TraversableResolver traversableResolver;
3230
private final HibernateConstraintValidatorInitializationContext constraintValidatorInitializationContext;
3331
private final ValidatorScopedContext validatorScopedContext;
3432

3533
public ValidationContextBuilder(
36-
BeanMetaDataManager beanMetaDataManager,
3734
ConstraintValidatorManager constraintValidatorManager,
3835
ConstraintValidatorFactory constraintValidatorFactory,
3936
ValidatorScopedContext validatorScopedContext,
4037
TraversableResolver traversableResolver,
4138
HibernateConstraintValidatorInitializationContext constraintValidatorInitializationContext) {
42-
this.beanMetaDataManager = beanMetaDataManager;
4339
this.constraintValidatorManager = constraintValidatorManager;
4440
this.constraintValidatorFactory = constraintValidatorFactory;
4541
this.traversableResolver = traversableResolver;
4642
this.constraintValidatorInitializationContext = constraintValidatorInitializationContext;
4743
this.validatorScopedContext = validatorScopedContext;
4844
}
4945

50-
public <T> BaseBeanValidationContext<T> forValidate(T rootBean) {
51-
@SuppressWarnings("unchecked")
52-
Class<T> rootBeanClass = (Class<T>) rootBean.getClass();
53-
BeanMetaData<T> rootBeanMetaData = beanMetaDataManager.getBeanMetaData( rootBeanClass );
54-
46+
public <T> BaseBeanValidationContext<T> forValidate(Class<T> rootBeanClass, BeanMetaData<T> rootBeanMetaData, T rootBean) {
5547
return new BeanValidationContext<>(
5648
constraintValidatorManager,
5749
constraintValidatorFactory,
@@ -64,11 +56,7 @@ public <T> BaseBeanValidationContext<T> forValidate(T rootBean) {
6456
);
6557
}
6658

67-
public <T> BaseBeanValidationContext<T> forValidateProperty(T rootBean, PathImpl propertyPath) {
68-
@SuppressWarnings("unchecked")
69-
Class<T> rootBeanClass = (Class<T>) rootBean.getClass();
70-
BeanMetaData<T> rootBeanMetaData = beanMetaDataManager.getBeanMetaData( rootBeanClass );
71-
59+
public <T> BaseBeanValidationContext<T> forValidateProperty(Class<T> rootBeanClass, BeanMetaData<T> rootBeanMetaData, T rootBean, PathImpl propertyPath) {
7260
return new PropertyValidationContext<>(
7361
constraintValidatorManager,
7462
constraintValidatorFactory,
@@ -82,9 +70,7 @@ public <T> BaseBeanValidationContext<T> forValidateProperty(T rootBean, PathImpl
8270
);
8371
}
8472

85-
public <T> BaseBeanValidationContext<T> forValidateValue(Class<T> rootBeanClass, PathImpl propertyPath) {
86-
BeanMetaData<T> rootBeanMetaData = beanMetaDataManager.getBeanMetaData( rootBeanClass );
87-
73+
public <T> BaseBeanValidationContext<T> forValidateValue(Class<T> rootBeanClass, BeanMetaData<T> rootBeanMetaData, PathImpl propertyPath) {
8874
return new PropertyValidationContext<>(
8975
constraintValidatorManager,
9076
constraintValidatorFactory,
@@ -99,13 +85,11 @@ public <T> BaseBeanValidationContext<T> forValidateValue(Class<T> rootBeanClass,
9985
}
10086

10187
public <T> ExecutableValidationContext<T> forValidateParameters(
88+
Class<T> rootBeanClass,
89+
BeanMetaData<T> rootBeanMetaData,
10290
T rootBean,
10391
Executable executable,
10492
Object[] executableParameters) {
105-
@SuppressWarnings("unchecked")
106-
Class<T> rootBeanClass = rootBean != null ? (Class<T>) rootBean.getClass() : (Class<T>) executable.getDeclaringClass();
107-
BeanMetaData<T> rootBeanMetaData = beanMetaDataManager.getBeanMetaData( rootBeanClass );
108-
10993
return new ParameterExecutableValidationContext<>(
11094
constraintValidatorManager,
11195
constraintValidatorFactory,
@@ -122,13 +106,11 @@ public <T> ExecutableValidationContext<T> forValidateParameters(
122106
}
123107

124108
public <T> ExecutableValidationContext<T> forValidateReturnValue(
109+
Class<T> rootBeanClass,
110+
BeanMetaData<T> rootBeanMetaData,
125111
T rootBean,
126112
Executable executable,
127113
Object executableReturnValue) {
128-
@SuppressWarnings("unchecked")
129-
Class<T> rootBeanClass = rootBean != null ? (Class<T>) rootBean.getClass() : (Class<T>) executable.getDeclaringClass();
130-
BeanMetaData<T> rootBeanMetaData = beanMetaDataManager.getBeanMetaData( rootBeanClass );
131-
132114
return new ReturnValueExecutableValidationContext<>(
133115
constraintValidatorManager,
134116
constraintValidatorFactory,

0 commit comments

Comments
 (0)