1
1
/*
2
- * Copyright 2002-2020 the original author or authors.
2
+ * Copyright 2002-2022 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
31
31
import javax .validation .Constraint ;
32
32
import javax .validation .ConstraintValidator ;
33
33
import javax .validation .ConstraintValidatorContext ;
34
+ import javax .validation .ConstraintValidatorFactory ;
34
35
import javax .validation .ConstraintViolation ;
35
36
import javax .validation .Payload ;
36
37
import javax .validation .Valid ;
43
44
import org .junit .jupiter .api .Test ;
44
45
45
46
import org .springframework .beans .factory .annotation .Autowired ;
47
+ import org .springframework .beans .factory .support .DefaultListableBeanFactory ;
46
48
import org .springframework .context .ConfigurableApplicationContext ;
47
49
import org .springframework .context .annotation .AnnotationConfigApplicationContext ;
48
50
import org .springframework .core .convert .support .DefaultConversionService ;
52
54
import org .springframework .validation .FieldError ;
53
55
import org .springframework .validation .ObjectError ;
54
56
import org .springframework .validation .beanvalidation .LocalValidatorFactoryBean ;
57
+ import org .springframework .validation .beanvalidation .SpringConstraintValidatorFactory ;
55
58
56
59
import static org .assertj .core .api .Assertions .assertThat ;
57
60
58
61
/**
59
62
* @author Juergen Hoeller
60
63
*/
61
- @ SuppressWarnings ("resource" )
62
- public class ValidatorFactoryTests {
64
+ class ValidatorFactoryTests {
63
65
64
66
@ Test
65
- @ SuppressWarnings ( "cast" )
66
- public void testSimpleValidation () {
67
+ void simpleValidation () {
68
+ @ SuppressWarnings ( "resource" )
67
69
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean ();
68
70
validator .afterPropertiesSet ();
69
71
@@ -78,15 +80,15 @@ public void testSimpleValidation() {
78
80
79
81
Validator nativeValidator = validator .unwrap (Validator .class );
80
82
assertThat (nativeValidator .getClass ().getName ().startsWith ("org.hibernate" )).isTrue ();
81
- assertThat (validator .unwrap (ValidatorFactory .class ) instanceof HibernateValidatorFactory ). isTrue ( );
82
- assertThat (validator .unwrap (HibernateValidatorFactory .class ) instanceof HibernateValidatorFactory ). isTrue ( );
83
+ assertThat (validator .unwrap (ValidatorFactory .class )). isInstanceOf ( HibernateValidatorFactory . class );
84
+ assertThat (validator .unwrap (HibernateValidatorFactory .class )). isInstanceOf ( HibernateValidatorFactory . class );
83
85
84
86
validator .destroy ();
85
87
}
86
88
87
89
@ Test
88
- @ SuppressWarnings ( "cast" )
89
- public void testSimpleValidationWithCustomProvider () {
90
+ void simpleValidationWithCustomProvider () {
91
+ @ SuppressWarnings ( "resource" )
90
92
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean ();
91
93
validator .setProviderClass (HibernateValidator .class );
92
94
validator .afterPropertiesSet ();
@@ -102,14 +104,15 @@ public void testSimpleValidationWithCustomProvider() {
102
104
103
105
Validator nativeValidator = validator .unwrap (Validator .class );
104
106
assertThat (nativeValidator .getClass ().getName ().startsWith ("org.hibernate" )).isTrue ();
105
- assertThat (validator .unwrap (ValidatorFactory .class ) instanceof HibernateValidatorFactory ). isTrue ( );
106
- assertThat (validator .unwrap (HibernateValidatorFactory .class ) instanceof HibernateValidatorFactory ). isTrue ( );
107
+ assertThat (validator .unwrap (ValidatorFactory .class )). isInstanceOf ( HibernateValidatorFactory . class );
108
+ assertThat (validator .unwrap (HibernateValidatorFactory .class )). isInstanceOf ( HibernateValidatorFactory . class );
107
109
108
110
validator .destroy ();
109
111
}
110
112
111
113
@ Test
112
- public void testSimpleValidationWithClassLevel () {
114
+ void simpleValidationWithClassLevel () {
115
+ @ SuppressWarnings ("resource" )
113
116
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean ();
114
117
validator .afterPropertiesSet ();
115
118
@@ -122,10 +125,13 @@ public void testSimpleValidationWithClassLevel() {
122
125
ConstraintViolation <?> cv = iterator .next ();
123
126
assertThat (cv .getPropertyPath ().toString ()).isEqualTo ("" );
124
127
assertThat (cv .getConstraintDescriptor ().getAnnotation () instanceof NameAddressValid ).isTrue ();
128
+
129
+ validator .destroy ();
125
130
}
126
131
127
132
@ Test
128
- public void testSpringValidationFieldType () {
133
+ void springValidationFieldType () {
134
+ @ SuppressWarnings ("resource" )
129
135
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean ();
130
136
validator .afterPropertiesSet ();
131
137
@@ -135,11 +141,16 @@ public void testSpringValidationFieldType() {
135
141
BeanPropertyBindingResult errors = new BeanPropertyBindingResult (person , "person" );
136
142
validator .validate (person , errors );
137
143
assertThat (errors .getErrorCount ()).isEqualTo (1 );
138
- assertThat (errors .getFieldError ("address" ).getRejectedValue ()).isInstanceOf (ValidAddress .class );
144
+ assertThat (errors .getFieldError ("address" ).getRejectedValue ())
145
+ .as ("Field/Value type mismatch" )
146
+ .isInstanceOf (ValidAddress .class );
147
+
148
+ validator .destroy ();
139
149
}
140
150
141
151
@ Test
142
- public void testSpringValidation () {
152
+ void springValidation () {
153
+ @ SuppressWarnings ("resource" )
143
154
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean ();
144
155
validator .afterPropertiesSet ();
145
156
@@ -164,10 +175,13 @@ public void testSpringValidation() {
164
175
assertThat (errorCodes .contains ("NotNull.street" )).isTrue ();
165
176
assertThat (errorCodes .contains ("NotNull.java.lang.String" )).isTrue ();
166
177
assertThat (errorCodes .contains ("NotNull" )).isTrue ();
178
+
179
+ validator .destroy ();
167
180
}
168
181
169
182
@ Test
170
- public void testSpringValidationWithClassLevel () {
183
+ void springValidationWithClassLevel () {
184
+ @ SuppressWarnings ("resource" )
171
185
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean ();
172
186
validator .afterPropertiesSet ();
173
187
@@ -182,10 +196,12 @@ public void testSpringValidationWithClassLevel() {
182
196
assertThat (errorCodes .size ()).isEqualTo (2 );
183
197
assertThat (errorCodes .contains ("NameAddressValid.person" )).isTrue ();
184
198
assertThat (errorCodes .contains ("NameAddressValid" )).isTrue ();
199
+
200
+ validator .destroy ();
185
201
}
186
202
187
203
@ Test
188
- public void testSpringValidationWithAutowiredValidator () {
204
+ void springValidationWithAutowiredValidator () {
189
205
ConfigurableApplicationContext ctx = new AnnotationConfigApplicationContext (
190
206
LocalValidatorFactoryBean .class );
191
207
LocalValidatorFactoryBean validator = ctx .getBean (LocalValidatorFactoryBean .class );
@@ -202,11 +218,14 @@ public void testSpringValidationWithAutowiredValidator() {
202
218
assertThat (errorCodes .size ()).isEqualTo (2 );
203
219
assertThat (errorCodes .contains ("NameAddressValid.person" )).isTrue ();
204
220
assertThat (errorCodes .contains ("NameAddressValid" )).isTrue ();
221
+
222
+ validator .destroy ();
205
223
ctx .close ();
206
224
}
207
225
208
226
@ Test
209
- public void testSpringValidationWithErrorInListElement () {
227
+ void springValidationWithErrorInListElement () {
228
+ @ SuppressWarnings ("resource" )
210
229
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean ();
211
230
validator .afterPropertiesSet ();
212
231
@@ -221,10 +240,13 @@ public void testSpringValidationWithErrorInListElement() {
221
240
assertThat (fieldError .getField ()).isEqualTo ("address.street" );
222
241
fieldError = result .getFieldError ("addressList[0].street" );
223
242
assertThat (fieldError .getField ()).isEqualTo ("addressList[0].street" );
243
+
244
+ validator .destroy ();
224
245
}
225
246
226
247
@ Test
227
- public void testSpringValidationWithErrorInSetElement () {
248
+ void springValidationWithErrorInSetElement () {
249
+ @ SuppressWarnings ("resource" )
228
250
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean ();
229
251
validator .afterPropertiesSet ();
230
252
@@ -239,10 +261,13 @@ public void testSpringValidationWithErrorInSetElement() {
239
261
assertThat (fieldError .getField ()).isEqualTo ("address.street" );
240
262
fieldError = result .getFieldError ("addressSet[].street" );
241
263
assertThat (fieldError .getField ()).isEqualTo ("addressSet[].street" );
264
+
265
+ validator .destroy ();
242
266
}
243
267
244
268
@ Test
245
- public void testInnerBeanValidation () {
269
+ void innerBeanValidation () {
270
+ @ SuppressWarnings ("resource" )
246
271
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean ();
247
272
validator .afterPropertiesSet ();
248
273
@@ -251,10 +276,13 @@ public void testInnerBeanValidation() {
251
276
validator .validate (mainBean , errors );
252
277
Object rejected = errors .getFieldValue ("inner.value" );
253
278
assertThat (rejected ).isNull ();
279
+
280
+ validator .destroy ();
254
281
}
255
282
256
283
@ Test
257
- public void testValidationWithOptionalField () {
284
+ void validationWithOptionalField () {
285
+ @ SuppressWarnings ("resource" )
258
286
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean ();
259
287
validator .afterPropertiesSet ();
260
288
@@ -263,10 +291,13 @@ public void testValidationWithOptionalField() {
263
291
validator .validate (mainBean , errors );
264
292
Object rejected = errors .getFieldValue ("inner.value" );
265
293
assertThat (rejected ).isNull ();
294
+
295
+ validator .destroy ();
266
296
}
267
297
268
298
@ Test
269
- public void testListValidation () {
299
+ void listValidation () {
300
+ @ SuppressWarnings ("resource" )
270
301
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean ();
271
302
validator .afterPropertiesSet ();
272
303
@@ -282,6 +313,34 @@ public void testListValidation() {
282
313
assertThat (fieldError ).isNotNull ();
283
314
assertThat (fieldError .getRejectedValue ()).isEqualTo ("X" );
284
315
assertThat (errors .getFieldValue ("list[1]" )).isEqualTo ("X" );
316
+
317
+ validator .destroy ();
318
+ }
319
+
320
+ @ Test
321
+ void withConstraintValidatorFactory () {
322
+ ConstraintValidatorFactory cvf = new SpringConstraintValidatorFactory (new DefaultListableBeanFactory ());
323
+
324
+ @ SuppressWarnings ("resource" )
325
+ LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean ();
326
+ validator .setConstraintValidatorFactory (cvf );
327
+ validator .afterPropertiesSet ();
328
+
329
+ assertThat (validator .getConstraintValidatorFactory ()).isSameAs (cvf );
330
+ validator .destroy ();
331
+ }
332
+
333
+ @ Test
334
+ void withCustomInitializer () {
335
+ ConstraintValidatorFactory cvf = new SpringConstraintValidatorFactory (new DefaultListableBeanFactory ());
336
+
337
+ @ SuppressWarnings ("resource" )
338
+ LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean ();
339
+ validator .setConfigurationInitializer (configuration -> configuration .constraintValidatorFactory (cvf ));
340
+ validator .afterPropertiesSet ();
341
+
342
+ assertThat (validator .getConstraintValidatorFactory ()).isSameAs (cvf );
343
+ validator .destroy ();
285
344
}
286
345
287
346
@@ -380,8 +439,8 @@ public boolean isValid(ValidPerson value, ConstraintValidatorContext context) {
380
439
}
381
440
boolean valid = (value .name == null || !value .address .street .contains (value .name ));
382
441
if (!valid && "Phil" .equals (value .name )) {
383
- context .buildConstraintViolationWithTemplate (
384
- context . getDefaultConstraintMessageTemplate ()) .addPropertyNode ("address" ).addConstraintViolation ().disableDefaultConstraintViolation ();
442
+ context .buildConstraintViolationWithTemplate (context . getDefaultConstraintMessageTemplate ())
443
+ .addPropertyNode ("address" ).addConstraintViolation ().disableDefaultConstraintViolation ();
385
444
}
386
445
return valid ;
387
446
}
@@ -417,6 +476,7 @@ public static class InnerBean {
417
476
public String getValue () {
418
477
return value ;
419
478
}
479
+
420
480
public void setValue (String value ) {
421
481
this .value = value ;
422
482
}
@@ -425,8 +485,8 @@ public void setValue(String value) {
425
485
426
486
@ Retention (RetentionPolicy .RUNTIME )
427
487
@ Target (ElementType .FIELD )
428
- @ Constraint (validatedBy = InnerValidator .class )
429
- public static @interface InnerValid {
488
+ @ Constraint (validatedBy = InnerValidator .class )
489
+ public @interface InnerValid {
430
490
431
491
String message () default "NOT VALID" ;
432
492
@@ -446,7 +506,8 @@ public void initialize(InnerValid constraintAnnotation) {
446
506
public boolean isValid (InnerBean bean , ConstraintValidatorContext context ) {
447
507
context .disableDefaultConstraintViolation ();
448
508
if (bean .getValue () == null ) {
449
- context .buildConstraintViolationWithTemplate ("NULL" ).addPropertyNode ("value" ).addConstraintViolation ();
509
+ context .buildConstraintViolationWithTemplate ("NULL" )
510
+ .addPropertyNode ("value" ).addConstraintViolation ();
450
511
return false ;
451
512
}
452
513
return true ;
@@ -494,7 +555,8 @@ public boolean isValid(List<String> list, ConstraintValidatorContext context) {
494
555
boolean valid = true ;
495
556
for (int i = 0 ; i < list .size (); i ++) {
496
557
if ("X" .equals (list .get (i ))) {
497
- context .buildConstraintViolationWithTemplate (context .getDefaultConstraintMessageTemplate ()).addBeanNode ().inIterable ().atIndex (i ).addConstraintViolation ();
558
+ context .buildConstraintViolationWithTemplate (context .getDefaultConstraintMessageTemplate ())
559
+ .addBeanNode ().inIterable ().atIndex (i ).addConstraintViolation ();
498
560
valid = false ;
499
561
}
500
562
}
0 commit comments