Skip to content

Commit c067767

Browse files
committed
HV-1772 Allow overriding MessageInterpolator when config is reused
1 parent 5966686 commit c067767

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/AbstractConfigurationImpl.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,9 @@ public T externalClassLoader(ClassLoader externalClassLoader) {
409409
Contracts.assertNotNull( externalClassLoader, MESSAGES.parameterMustNotBeNull( "externalClassLoader" ) );
410410
this.externalClassLoader = externalClassLoader;
411411

412+
// we need to reset the messageInterpolator field as it might vary depending on the class loader
413+
this.messageInterpolator = null;
414+
412415
return thisAsT();
413416
}
414417

@@ -468,15 +471,13 @@ public final boolean isIgnoreXmlConfiguration() {
468471

469472
@Override
470473
public final MessageInterpolator getMessageInterpolator() {
474+
// apply explicitly given MI, otherwise use default one
475+
MessageInterpolator selectedInterpolator = validationBootstrapParameters.getMessageInterpolator();
476+
if ( selectedInterpolator != null ) {
477+
return selectedInterpolator;
478+
}
471479
if ( messageInterpolator == null ) {
472-
// apply explicitly given MI, otherwise use default one
473-
MessageInterpolator interpolator = validationBootstrapParameters.getMessageInterpolator();
474-
if ( interpolator != null ) {
475-
messageInterpolator = interpolator;
476-
}
477-
else {
478-
messageInterpolator = getDefaultMessageInterpolatorConfiguredWithClassLoader();
479-
}
480+
messageInterpolator = getDefaultMessageInterpolatorConfiguredWithClassLoader();
480481
}
481482

482483
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)