Skip to content

Commit 6702a5e

Browse files
committed
HV-1772 Allow overriding MessageInterpolator when config is reused
1 parent f99e866 commit 6702a5e

File tree

2 files changed

+68
-8
lines changed

2 files changed

+68
-8
lines changed

engine/src/main/java/org/hibernate/validator/internal/engine/ConfigurationImpl.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,9 @@ public HibernateValidatorConfiguration externalClassLoader(ClassLoader externalC
330330
Contracts.assertNotNull( externalClassLoader, MESSAGES.parameterMustNotBeNull( "externalClassLoader" ) );
331331
this.externalClassLoader = externalClassLoader;
332332

333+
// we need to reset the messageInterpolator field as it might vary depending on the class loader
334+
this.messageInterpolator = null;
335+
333336
return this;
334337
}
335338

@@ -406,15 +409,13 @@ public final boolean isIgnoreXmlConfiguration() {
406409

407410
@Override
408411
public final MessageInterpolator getMessageInterpolator() {
412+
// apply explicitly given MI, otherwise use default one
413+
MessageInterpolator selectedInterpolator = validationBootstrapParameters.getMessageInterpolator();
414+
if ( selectedInterpolator != null ) {
415+
return selectedInterpolator;
416+
}
409417
if ( messageInterpolator == null ) {
410-
// apply explicitly given MI, otherwise use default one
411-
MessageInterpolator interpolator = validationBootstrapParameters.getMessageInterpolator();
412-
if ( interpolator != null ) {
413-
messageInterpolator = interpolator;
414-
}
415-
else {
416-
messageInterpolator = getDefaultMessageInterpolatorConfiguredWithClassLoader();
417-
}
418+
messageInterpolator = getDefaultMessageInterpolatorConfiguredWithClassLoader();
418419
}
419420

420421
return messageInterpolator;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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.internal.bootstrap;
8+
9+
import static org.testng.Assert.assertSame;
10+
11+
import java.util.Locale;
12+
13+
import javax.validation.Configuration;
14+
import javax.validation.MessageInterpolator;
15+
import javax.validation.Validation;
16+
import javax.validation.ValidatorFactory;
17+
18+
import org.testng.annotations.Test;
19+
20+
/**
21+
* @author Steven Walters
22+
* @author Guillaume Smet
23+
*/
24+
public class ConfigurationReuseHibernateValidatorTest {
25+
26+
public static class MessageInterpolatorImpl implements MessageInterpolator {
27+
28+
private final String prefix;
29+
30+
public MessageInterpolatorImpl(String prefix) {
31+
this.prefix = prefix;
32+
}
33+
34+
@Override
35+
public String interpolate(String messageTemplate, Context context) {
36+
return prefix + ": " + messageTemplate;
37+
}
38+
39+
@Override
40+
public String interpolate(String messageTemplate, Context context, Locale locale) {
41+
return prefix + ": " + messageTemplate + locale.toLanguageTag();
42+
}
43+
44+
public String toString() {
45+
return getClass().getSimpleName() + prefix;
46+
}
47+
}
48+
49+
@Test
50+
public void testMessageInterpolatorChange() {
51+
Configuration<?> config = Validation.byDefaultProvider().configure();
52+
MessageInterpolator interpolator1 = new MessageInterpolatorImpl( "One" );
53+
MessageInterpolator interpolator2 = new MessageInterpolatorImpl( "Two" );
54+
ValidatorFactory factory1 = config.messageInterpolator( interpolator1 ).buildValidatorFactory();
55+
ValidatorFactory factory2 = config.messageInterpolator( interpolator2 ).buildValidatorFactory();
56+
assertSame( factory1.getMessageInterpolator(), interpolator1 );
57+
assertSame( factory2.getMessageInterpolator(), interpolator2 );
58+
}
59+
}

0 commit comments

Comments
 (0)