20
20
import java .lang .annotation .RetentionPolicy ;
21
21
import java .lang .reflect .Method ;
22
22
23
- import jakarta .validation .ValidationException ;
23
+ import jakarta .validation .ConstraintViolationException ;
24
+ import jakarta .validation .Validation ;
24
25
import jakarta .validation .Validator ;
26
+ import jakarta .validation .ValidatorFactory ;
25
27
import jakarta .validation .constraints .Max ;
26
28
import jakarta .validation .constraints .NotNull ;
27
29
import jakarta .validation .groups .Default ;
45
47
import org .springframework .scheduling .annotation .AsyncAnnotationBeanPostProcessor ;
46
48
import org .springframework .util .ClassUtils ;
47
49
import org .springframework .util .ReflectionUtils ;
50
+ import org .springframework .util .function .SingletonSupplier ;
48
51
import org .springframework .validation .annotation .Validated ;
52
+ import org .springframework .validation .method .MethodValidationException ;
49
53
50
54
import static org .assertj .core .api .Assertions .assertThat ;
51
55
import static org .assertj .core .api .Assertions .assertThatExceptionOfType ;
@@ -66,7 +70,19 @@ public void testMethodValidationInterceptor() {
66
70
ProxyFactory factory = new ProxyFactory (bean );
67
71
factory .addAdvice (new MethodValidationInterceptor ());
68
72
factory .addAdvisor (new AsyncAnnotationAdvisor ());
69
- doTestProxyValidation ((MyValidInterface <String >) factory .getProxy ());
73
+ doTestProxyValidation ((MyValidInterface <String >) factory .getProxy (), ConstraintViolationException .class );
74
+ }
75
+
76
+ @ Test
77
+ @ SuppressWarnings ("unchecked" )
78
+ public void testMethodValidationInterceptorWithAdaptConstraintViolations () {
79
+ MyValidBean bean = new MyValidBean ();
80
+ ProxyFactory factory = new ProxyFactory (bean );
81
+ try (ValidatorFactory validatorFactory = Validation .buildDefaultValidatorFactory ()) {
82
+ factory .addAdvice (new MethodValidationInterceptor (SingletonSupplier .of (validatorFactory .getValidator ()), true ));
83
+ factory .addAdvisor (new AsyncAnnotationAdvisor ());
84
+ doTestProxyValidation ((MyValidInterface <String >) factory .getProxy (), MethodValidationException .class );
85
+ }
70
86
}
71
87
72
88
@ Test
@@ -79,7 +95,26 @@ public void testMethodValidationPostProcessor() {
79
95
context .registerSingleton ("aapp" , AsyncAnnotationBeanPostProcessor .class , pvs );
80
96
context .registerSingleton ("bean" , MyValidBean .class );
81
97
context .refresh ();
82
- doTestProxyValidation (context .getBean ("bean" , MyValidInterface .class ));
98
+ doTestProxyValidation (context .getBean ("bean" , MyValidInterface .class ), ConstraintViolationException .class );
99
+ context .close ();
100
+ }
101
+
102
+ @ Test
103
+ @ SuppressWarnings ("unchecked" )
104
+ public void testMethodValidationPostProcessorWithAdaptConstraintViolations () {
105
+ StaticApplicationContext context = new StaticApplicationContext ();
106
+ context .registerBean (MethodValidationPostProcessor .class , () -> {
107
+ MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor ();
108
+ postProcessor .setAdaptConstraintViolations (true );
109
+ return postProcessor ;
110
+ });
111
+
112
+ MutablePropertyValues pvs = new MutablePropertyValues ();
113
+ pvs .add ("beforeExistingAdvisors" , false );
114
+ context .registerSingleton ("aapp" , AsyncAnnotationBeanPostProcessor .class , pvs );
115
+ context .registerSingleton ("bean" , MyValidBean .class );
116
+ context .refresh ();
117
+ doTestProxyValidation (context .getBean ("bean" , MyValidInterface .class ), MethodValidationException .class );
83
118
context .close ();
84
119
}
85
120
@@ -90,21 +125,38 @@ public void testMethodValidationPostProcessorForInterfaceOnlyProxy() {
90
125
context .registerBean (MyValidInterface .class , () ->
91
126
ProxyFactory .getProxy (MyValidInterface .class , new MyValidClientInterfaceMethodInterceptor ()));
92
127
context .refresh ();
93
- doTestProxyValidation (context .getBean (MyValidInterface .class ));
128
+ doTestProxyValidation (context .getBean (MyValidInterface .class ), ConstraintViolationException .class );
129
+ context .close ();
130
+ }
131
+
132
+ @ Test
133
+ @ SuppressWarnings ("unchecked" )
134
+ public void testMethodValidationPostProcessorForInterfaceOnlyProxyWithAdaptConstraintViolations () {
135
+ AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext ();
136
+ context .registerBean (MethodValidationPostProcessor .class , () -> {
137
+ MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor ();
138
+ postProcessor .setAdaptConstraintViolations (true );
139
+ return postProcessor ;
140
+ });
141
+
142
+ context .registerBean (MyValidInterface .class , () ->
143
+ ProxyFactory .getProxy (MyValidInterface .class , new MyValidClientInterfaceMethodInterceptor ()));
144
+ context .refresh ();
145
+ doTestProxyValidation (context .getBean (MyValidInterface .class ), MethodValidationException .class );
94
146
context .close ();
95
147
}
96
148
97
149
@ SuppressWarnings ("DataFlowIssue" )
98
- private void doTestProxyValidation (MyValidInterface <String > proxy ) {
150
+ private void doTestProxyValidation (MyValidInterface <String > proxy , Class <? extends Exception > expectedExceptionClass ) {
99
151
assertThat (proxy .myValidMethod ("value" , 5 )).isNotNull ();
100
- assertThatExceptionOfType (ValidationException . class ).isThrownBy (() -> proxy .myValidMethod ("value" , 15 ));
101
- assertThatExceptionOfType (ValidationException . class ).isThrownBy (() -> proxy .myValidMethod (null , 5 ));
102
- assertThatExceptionOfType (ValidationException . class ).isThrownBy (() -> proxy .myValidMethod ("value" , 0 ));
152
+ assertThatExceptionOfType (expectedExceptionClass ).isThrownBy (() -> proxy .myValidMethod ("value" , 15 ));
153
+ assertThatExceptionOfType (expectedExceptionClass ).isThrownBy (() -> proxy .myValidMethod (null , 5 ));
154
+ assertThatExceptionOfType (expectedExceptionClass ).isThrownBy (() -> proxy .myValidMethod ("value" , 0 ));
103
155
proxy .myValidAsyncMethod ("value" , 5 );
104
- assertThatExceptionOfType (ValidationException . class ).isThrownBy (() -> proxy .myValidAsyncMethod ("value" , 15 ));
105
- assertThatExceptionOfType (ValidationException . class ).isThrownBy (() -> proxy .myValidAsyncMethod (null , 5 ));
156
+ assertThatExceptionOfType (expectedExceptionClass ).isThrownBy (() -> proxy .myValidAsyncMethod ("value" , 15 ));
157
+ assertThatExceptionOfType (expectedExceptionClass ).isThrownBy (() -> proxy .myValidAsyncMethod (null , 5 ));
106
158
assertThat (proxy .myGenericMethod ("myValue" )).isEqualTo ("myValue" );
107
- assertThatExceptionOfType (ValidationException . class ).isThrownBy (() -> proxy .myGenericMethod (null ));
159
+ assertThatExceptionOfType (expectedExceptionClass ).isThrownBy (() -> proxy .myGenericMethod (null ));
108
160
}
109
161
110
162
@ Test
@@ -122,6 +174,11 @@ void testLazyValidatorForMethodValidationWithValidatorProvider() {
122
174
doTestLazyValidatorForMethodValidation (LazyMethodValidationConfigWithValidatorProvider .class );
123
175
}
124
176
177
+ @ Test
178
+ void testLazyValidatorForMethodValidationWithAdaptConstraintViolations () {
179
+ doTestLazyValidatorForMethodValidation (LazyMethodValidationConfigWithAdaptConstraintViolations .class );
180
+ }
181
+
125
182
private void doTestLazyValidatorForMethodValidation (Class <?> configClass ) {
126
183
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext ();
127
184
context .register (configClass , CustomValidatorBean .class , MyValidBean .class , MyValidFactoryBean .class );
@@ -278,4 +335,16 @@ public static MethodValidationPostProcessor methodValidationPostProcessor(Object
278
335
}
279
336
}
280
337
338
+ @ Configuration
339
+ public static class LazyMethodValidationConfigWithAdaptConstraintViolations {
340
+
341
+ @ Bean
342
+ public static MethodValidationPostProcessor methodValidationPostProcessor (ObjectProvider <Validator > validator ) {
343
+ MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor ();
344
+ postProcessor .setValidatorProvider (validator );
345
+ postProcessor .setAdaptConstraintViolations (true );
346
+ return postProcessor ;
347
+ }
348
+ }
349
+
281
350
}
0 commit comments