Skip to content

Commit 678023e

Browse files
marko-bekhtagsmet
authored andcommitted
HV-1352 Only accessing validated value after a value unwrapper has set (if present)
1 parent 636a0d6 commit 678023e

File tree

2 files changed

+73
-9
lines changed

2 files changed

+73
-9
lines changed

engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ConstraintTree.java

+10-9
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,18 @@
66
*/
77
package org.hibernate.validator.internal.engine.constraintvalidation;
88

9+
import static org.hibernate.validator.constraints.CompositionType.ALL_FALSE;
10+
import static org.hibernate.validator.constraints.CompositionType.AND;
11+
import static org.hibernate.validator.constraints.CompositionType.OR;
12+
import static org.hibernate.validator.internal.util.CollectionHelper.newArrayList;
13+
import static org.hibernate.validator.internal.util.CollectionHelper.newHashSet;
14+
915
import java.lang.annotation.Annotation;
1016
import java.lang.reflect.Type;
1117
import java.util.Collections;
1218
import java.util.List;
1319
import java.util.Set;
20+
1421
import javax.validation.ConstraintValidator;
1522
import javax.validation.ConstraintViolation;
1623

@@ -23,12 +30,6 @@
2330
import org.hibernate.validator.internal.util.logging.LoggerFactory;
2431
import org.hibernate.validator.spi.valuehandling.ValidatedValueUnwrapper;
2532

26-
import static org.hibernate.validator.constraints.CompositionType.ALL_FALSE;
27-
import static org.hibernate.validator.constraints.CompositionType.AND;
28-
import static org.hibernate.validator.constraints.CompositionType.OR;
29-
import static org.hibernate.validator.internal.util.CollectionHelper.newArrayList;
30-
import static org.hibernate.validator.internal.util.CollectionHelper.newHashSet;
31-
3233
/**
3334
* Due to constraint composition a single constraint annotation can lead to a whole constraint tree being validated.
3435
* This class encapsulates such a tree.
@@ -104,6 +105,9 @@ private <T, V> void validateConstraints(ValidationContext<T> validationContext,
104105
// After all children are validated the actual ConstraintValidator of the constraint itself is executed
105106
if ( mainConstraintNeedsEvaluation( validationContext, constraintViolations ) ) {
106107

108+
// find the right constraint validator
109+
ConstraintValidator<A, V> validator = getInitializedConstraintValidator( validationContext, valueContext );
110+
107111
if ( log.isTraceEnabled() ) {
108112
log.tracef(
109113
"Validating value %s against constraint defined by %s.",
@@ -112,9 +116,6 @@ private <T, V> void validateConstraints(ValidationContext<T> validationContext,
112116
);
113117
}
114118

115-
// find the right constraint validator
116-
ConstraintValidator<A, V> validator = getInitializedConstraintValidator( validationContext, valueContext );
117-
118119
// create a constraint validator context
119120
ConstraintValidatorContextImpl constraintValidatorContext = new ConstraintValidatorContextImpl(
120121
validationContext.getParameterNames(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*
2+
* Hibernate Validator, declare and validate application constraints
3+
*
4+
* License: Apache License, Version 2.0
5+
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
6+
*/
7+
package org.hibernate.validator.test;
8+
9+
import static org.hibernate.validator.testutil.ConstraintViolationAssert.assertNumberOfViolations;
10+
import static org.hibernate.validator.testutils.ValidatorUtil.getValidator;
11+
12+
import java.util.Optional;
13+
14+
import javax.validation.constraints.NotNull;
15+
16+
import org.hibernate.validator.testutil.TestForIssue;
17+
import org.hibernate.validator.valuehandling.UnwrapValidatedValue;
18+
19+
import org.apache.log4j.Level;
20+
import org.apache.log4j.LogManager;
21+
import org.testng.annotations.AfterMethod;
22+
import org.testng.annotations.BeforeMethod;
23+
import org.testng.annotations.Test;
24+
25+
/**
26+
* @author Marko Bekhta
27+
*/
28+
public class TraceLoggingTest {
29+
30+
private Level currentLevel;
31+
32+
@BeforeMethod
33+
public void setUp() throws Exception {
34+
currentLevel = LogManager.getRootLogger().getLevel();
35+
LogManager.getRootLogger().setLevel( Level.TRACE );
36+
}
37+
38+
@Test
39+
@TestForIssue(jiraKey = "HV-1352")
40+
public void testLoggingIsNotFailing() {
41+
assertNumberOfViolations( getValidator().validate( new Foo( Optional.of( 1 ), 1 ) ), 0 );
42+
}
43+
44+
@AfterMethod
45+
public void tearDown() throws Exception {
46+
LogManager.getRootLogger().setLevel( currentLevel );
47+
}
48+
49+
private static class Foo {
50+
51+
@NotNull
52+
@UnwrapValidatedValue
53+
private final Optional<Integer> optInt;
54+
@NotNull
55+
private final Integer integer;
56+
57+
public Foo(@NotNull Optional<Integer> optInt, @NotNull Integer integer) {
58+
this.optInt = optInt;
59+
this.integer = integer;
60+
}
61+
}
62+
63+
}

0 commit comments

Comments
 (0)