|
11 | 11 | import static org.hibernate.validator.internal.util.ConcurrentReferenceHashMap.ReferenceType.SOFT;
|
12 | 12 | import static org.hibernate.validator.internal.util.logging.Messages.MESSAGES;
|
13 | 13 |
|
| 14 | +import java.util.ArrayList; |
14 | 15 | import java.util.EnumSet;
|
15 | 16 | import java.util.List;
|
16 | 17 |
|
|
28 | 29 | import org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider;
|
29 | 30 | import org.hibernate.validator.internal.metadata.provider.MetaDataProvider;
|
30 | 31 | import org.hibernate.validator.internal.metadata.raw.BeanConfiguration;
|
| 32 | +import org.hibernate.validator.internal.util.CollectionHelper; |
31 | 33 | import org.hibernate.validator.internal.util.ConcurrentReferenceHashMap;
|
32 | 34 | import org.hibernate.validator.internal.util.Contracts;
|
33 | 35 | import org.hibernate.validator.internal.util.ExecutableHelper;
|
34 | 36 | import org.hibernate.validator.internal.util.ExecutableParameterNameProvider;
|
35 | 37 | import org.hibernate.validator.internal.util.TypeResolutionHelper;
|
36 | 38 | import org.hibernate.validator.internal.util.classhierarchy.ClassHierarchyHelper;
|
| 39 | +import org.hibernate.validator.internal.util.stereotypes.Immutable; |
37 | 40 |
|
38 | 41 | /**
|
39 | 42 | * This manager is in charge of providing all constraint related meta data
|
@@ -74,6 +77,7 @@ public class BeanMetaDataManager {
|
74 | 77 | * Additional metadata providers used for meta data retrieval if
|
75 | 78 | * the XML and/or programmatic configuration is used.
|
76 | 79 | */
|
| 80 | + @Immutable |
77 | 81 | private final List<MetaDataProvider> metaDataProviders;
|
78 | 82 |
|
79 | 83 | /**
|
@@ -140,17 +144,20 @@ public BeanMetaDataManager(ConstraintHelper constraintHelper,
|
140 | 144 |
|
141 | 145 | AnnotationProcessingOptions annotationProcessingOptions = getAnnotationProcessingOptionsFromNonDefaultProviders( optionalMetaDataProviders );
|
142 | 146 | AnnotationMetaDataProvider defaultProvider = new AnnotationMetaDataProvider(
|
143 |
| - constraintHelper, |
144 |
| - typeResolutionHelper, |
145 |
| - valueExtractorManager, |
146 |
| - annotationProcessingOptions |
147 |
| - ); |
148 |
| - this.metaDataProviders = newArrayList(); |
149 |
| - // default annotation based metadata provider should go first in the list of providers to prevent possible issues |
150 |
| - // similar to HV-1450. This way after the first run we will have all possible constrained elements in the list and |
151 |
| - // should only merge in additional constraint information from other providers. |
152 |
| - this.metaDataProviders.add( defaultProvider ); |
153 |
| - this.metaDataProviders.addAll( optionalMetaDataProviders ); |
| 147 | + constraintHelper, |
| 148 | + typeResolutionHelper, |
| 149 | + valueExtractorManager, |
| 150 | + annotationProcessingOptions |
| 151 | + ); |
| 152 | + List<MetaDataProvider> tmpMetaDataProviders = new ArrayList<>( optionalMetaDataProviders.size() + 1 ); |
| 153 | + // We add the annotation based metadata provider at the first position so that the entire metadata model is assembled |
| 154 | + // first. |
| 155 | + // The other optional metadata providers will then contribute their additional metadata to the preexisting model. |
| 156 | + // This helps to mitigate issues like HV-1450. |
| 157 | + tmpMetaDataProviders.add( defaultProvider ); |
| 158 | + tmpMetaDataProviders.addAll( optionalMetaDataProviders ); |
| 159 | + |
| 160 | + this.metaDataProviders = CollectionHelper.toImmutableList( tmpMetaDataProviders ); |
154 | 161 | }
|
155 | 162 |
|
156 | 163 | @SuppressWarnings("unchecked")
|
|
0 commit comments