6
6
*/
7
7
package org .hibernate .validator .internal .engine .constraintvalidation ;
8
8
9
+ import java .lang .annotation .Annotation ;
9
10
import java .lang .invoke .MethodHandles ;
10
11
import java .util .ArrayList ;
11
12
import java .util .Collections ;
28
29
import javax .validation .metadata .ConstraintDescriptor ;
29
30
30
31
import org .hibernate .validator .constraintvalidation .HibernateConstraintValidatorContext ;
32
+ import org .hibernate .validator .constraintvalidation .HibernateConstraintViolationBuilder ;
31
33
import org .hibernate .validator .internal .engine .path .PathImpl ;
32
34
import org .hibernate .validator .internal .util .CollectionHelper ;
33
35
import org .hibernate .validator .internal .util .Contracts ;
@@ -75,7 +77,7 @@ public final String getDefaultConstraintMessageTemplate() {
75
77
}
76
78
77
79
@ Override
78
- public ConstraintViolationBuilder buildConstraintViolationWithTemplate (String messageTemplate ) {
80
+ public HibernateConstraintViolationBuilder buildConstraintViolationWithTemplate (String messageTemplate ) {
79
81
return new ConstraintViolationBuilderImpl (
80
82
messageTemplate ,
81
83
getCopyOfBasePath ()
@@ -168,6 +170,7 @@ protected final PathImpl getCopyOfBasePath() {
168
170
private ConstraintViolationCreationContext getDefaultConstraintViolationCreationContext () {
169
171
return new ConstraintViolationCreationContext (
170
172
getDefaultConstraintMessageTemplate (),
173
+ true , // EL is enabled for the default constraint violation
171
174
basePath ,
172
175
messageParameters != null ? new HashMap <>( messageParameters ) : Collections .emptyMap (),
173
176
expressionVariables != null ? new HashMap <>( expressionVariables ) : Collections .emptyMap (),
@@ -178,6 +181,7 @@ private ConstraintViolationCreationContext getDefaultConstraintViolationCreation
178
181
private abstract class NodeBuilderBase {
179
182
180
183
protected final String messageTemplate ;
184
+ protected boolean expressionLanguageEnabled ;
181
185
protected PathImpl propertyPath ;
182
186
183
187
protected NodeBuilderBase (String template , PathImpl path ) {
@@ -189,9 +193,14 @@ public ConstraintValidatorContext addConstraintViolation() {
189
193
if ( constraintViolationCreationContexts == null ) {
190
194
constraintViolationCreationContexts = CollectionHelper .newArrayList ( 3 );
191
195
}
196
+ if ( !(expressionVariables == null || expressionVariables .isEmpty ()) && !expressionLanguageEnabled ) {
197
+ LOG .expressionVariablesDefinedWithExpressionLanguageNotEnabled (
198
+ constraintDescriptor .getAnnotation () != null ? constraintDescriptor .getAnnotation ().annotationType () : Annotation .class );
199
+ }
192
200
constraintViolationCreationContexts .add (
193
201
new ConstraintViolationCreationContext (
194
202
messageTemplate ,
203
+ expressionLanguageEnabled ,
195
204
propertyPath ,
196
205
messageParameters != null ? new HashMap <>( messageParameters ) : Collections .emptyMap (),
197
206
expressionVariables != null ? new HashMap <>( expressionVariables ) : Collections .emptyMap (),
@@ -202,12 +211,18 @@ public ConstraintValidatorContext addConstraintViolation() {
202
211
}
203
212
}
204
213
205
- protected class ConstraintViolationBuilderImpl extends NodeBuilderBase implements ConstraintViolationBuilder {
214
+ protected class ConstraintViolationBuilderImpl extends NodeBuilderBase implements HibernateConstraintViolationBuilder {
206
215
207
216
protected ConstraintViolationBuilderImpl (String template , PathImpl path ) {
208
217
super ( template , path );
209
218
}
210
219
220
+ @ Override
221
+ public HibernateConstraintViolationBuilder enableExpressionLanguage () {
222
+ expressionLanguageEnabled = true ;
223
+ return this ;
224
+ }
225
+
211
226
@ Override
212
227
@ Deprecated
213
228
public NodeBuilderDefinedContext addNode (String name ) {
@@ -221,12 +236,12 @@ public NodeBuilderDefinedContext addNode(String name) {
221
236
public NodeBuilderCustomizableContext addPropertyNode (String name ) {
222
237
dropLeafNodeIfRequired ();
223
238
224
- return new DeferredNodeBuilder ( messageTemplate , propertyPath , name , ElementKind .PROPERTY );
239
+ return new DeferredNodeBuilder ( messageTemplate , expressionLanguageEnabled , propertyPath , name , ElementKind .PROPERTY );
225
240
}
226
241
227
242
@ Override
228
243
public LeafNodeBuilderCustomizableContext addBeanNode () {
229
- return new DeferredNodeBuilder ( messageTemplate , propertyPath , null , ElementKind .BEAN );
244
+ return new DeferredNodeBuilder ( messageTemplate , expressionLanguageEnabled , propertyPath , null , ElementKind .BEAN );
230
245
}
231
246
232
247
@ Override
@@ -238,7 +253,7 @@ public NodeBuilderDefinedContext addParameterNode(int index) {
238
253
public ContainerElementNodeBuilderCustomizableContext addContainerElementNode (String name , Class <?> containerType , Integer typeArgumentIndex ) {
239
254
dropLeafNodeIfRequired ();
240
255
241
- return new DeferredNodeBuilder ( messageTemplate , propertyPath , name , containerType , typeArgumentIndex );
256
+ return new DeferredNodeBuilder ( messageTemplate , expressionLanguageEnabled , propertyPath , name , containerType , typeArgumentIndex );
242
257
}
243
258
244
259
/**
@@ -267,17 +282,17 @@ public ConstraintViolationBuilder.NodeBuilderCustomizableContext addNode(String
267
282
268
283
@ Override
269
284
public NodeBuilderCustomizableContext addPropertyNode (String name ) {
270
- return new DeferredNodeBuilder ( messageTemplate , propertyPath , name , ElementKind .PROPERTY );
285
+ return new DeferredNodeBuilder ( messageTemplate , expressionLanguageEnabled , propertyPath , name , ElementKind .PROPERTY );
271
286
}
272
287
273
288
@ Override
274
289
public LeafNodeBuilderCustomizableContext addBeanNode () {
275
- return new DeferredNodeBuilder ( messageTemplate , propertyPath , null , ElementKind .BEAN );
290
+ return new DeferredNodeBuilder ( messageTemplate , expressionLanguageEnabled , propertyPath , null , ElementKind .BEAN );
276
291
}
277
292
278
293
@ Override
279
294
public ContainerElementNodeBuilderCustomizableContext addContainerElementNode (String name , Class <?> containerType , Integer typeArgumentIndex ) {
280
- return new DeferredNodeBuilder ( messageTemplate , propertyPath , name , containerType , typeArgumentIndex );
295
+ return new DeferredNodeBuilder ( messageTemplate , expressionLanguageEnabled , propertyPath , name , containerType , typeArgumentIndex );
281
296
}
282
297
}
283
298
@@ -293,16 +308,23 @@ private class DeferredNodeBuilder extends NodeBuilderBase
293
308
294
309
private final Integer leafNodeTypeArgumentIndex ;
295
310
296
- private DeferredNodeBuilder (String template , PathImpl path , String nodeName , ElementKind leafNodeKind ) {
311
+ private DeferredNodeBuilder (String template , boolean expressionLanguageEnabled , PathImpl path , String nodeName , ElementKind leafNodeKind ) {
297
312
super ( template , path );
313
+ this .expressionLanguageEnabled = expressionLanguageEnabled ;
298
314
this .leafNodeName = nodeName ;
299
315
this .leafNodeKind = leafNodeKind ;
300
316
this .leafNodeContainerType = null ;
301
317
this .leafNodeTypeArgumentIndex = null ;
302
318
}
303
319
304
- private DeferredNodeBuilder (String template , PathImpl path , String nodeName , Class <?> leafNodeContainerType , Integer leafNodeTypeArgumentIndex ) {
320
+ private DeferredNodeBuilder (String template ,
321
+ boolean expressionLanguageEnabled ,
322
+ PathImpl path ,
323
+ String nodeName ,
324
+ Class <?> leafNodeContainerType ,
325
+ Integer leafNodeTypeArgumentIndex ) {
305
326
super ( template , path );
327
+ this .expressionLanguageEnabled = expressionLanguageEnabled ;
306
328
this .leafNodeName = nodeName ;
307
329
this .leafNodeKind = ElementKind .CONTAINER_ELEMENT ;
308
330
this .leafNodeContainerType = leafNodeContainerType ;
@@ -344,19 +366,19 @@ public NodeBuilderCustomizableContext addNode(String name) {
344
366
@ Override
345
367
public NodeBuilderCustomizableContext addPropertyNode (String name ) {
346
368
addLeafNode ();
347
- return new DeferredNodeBuilder ( messageTemplate , propertyPath , name , ElementKind .PROPERTY );
369
+ return new DeferredNodeBuilder ( messageTemplate , expressionLanguageEnabled , propertyPath , name , ElementKind .PROPERTY );
348
370
}
349
371
350
372
@ Override
351
373
public ContainerElementNodeBuilderCustomizableContext addContainerElementNode (String name , Class <?> containerType , Integer typeArgumentIndex ) {
352
374
addLeafNode ();
353
- return new DeferredNodeBuilder ( messageTemplate , propertyPath , name , containerType , typeArgumentIndex );
375
+ return new DeferredNodeBuilder ( messageTemplate , expressionLanguageEnabled , propertyPath , name , containerType , typeArgumentIndex );
354
376
}
355
377
356
378
@ Override
357
379
public LeafNodeBuilderCustomizableContext addBeanNode () {
358
380
addLeafNode ();
359
- return new DeferredNodeBuilder ( messageTemplate , propertyPath , null , ElementKind .BEAN );
381
+ return new DeferredNodeBuilder ( messageTemplate , expressionLanguageEnabled , propertyPath , null , ElementKind .BEAN );
360
382
}
361
383
362
384
@ Override
0 commit comments