Allow common messages to be specified for message sources
Extend message source configuration properties and auto-configuration to support common messages. See gh-42472
This commit is contained in:
parent
d9668672f8
commit
573ccc5007
|
|
@ -16,7 +16,10 @@
|
||||||
|
|
||||||
package org.springframework.boot.autoconfigure.context;
|
package org.springframework.boot.autoconfigure.context;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UncheckedIOException;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.springframework.aot.hint.RuntimeHints;
|
import org.springframework.aot.hint.RuntimeHints;
|
||||||
import org.springframework.aot.hint.RuntimeHintsRegistrar;
|
import org.springframework.aot.hint.RuntimeHintsRegistrar;
|
||||||
|
|
@ -41,6 +44,7 @@ import org.springframework.context.support.ResourceBundleMessageSource;
|
||||||
import org.springframework.core.Ordered;
|
import org.springframework.core.Ordered;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
||||||
|
import org.springframework.core.io.support.PropertiesLoaderUtils;
|
||||||
import org.springframework.core.type.AnnotatedTypeMetadata;
|
import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
import org.springframework.util.ConcurrentReferenceHashMap;
|
import org.springframework.util.ConcurrentReferenceHashMap;
|
||||||
|
|
@ -81,6 +85,19 @@ public class MessageSourceAutoConfiguration {
|
||||||
}
|
}
|
||||||
messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
|
messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
|
||||||
messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
|
messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (properties.getCommonMessages() != null) {
|
||||||
|
Properties commonProperties = new Properties();
|
||||||
|
for (Resource commonResource : properties.getCommonMessages()) {
|
||||||
|
PropertiesLoaderUtils.fillProperties(commonProperties, commonResource);
|
||||||
|
}
|
||||||
|
messageSource.setCommonMessages(commonProperties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException ex) {
|
||||||
|
throw new UncheckedIOException("Failed to load common messages", ex);
|
||||||
|
}
|
||||||
return messageSource;
|
return messageSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import java.util.List;
|
||||||
|
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
import org.springframework.boot.convert.DurationUnit;
|
import org.springframework.boot.convert.DurationUnit;
|
||||||
|
import org.springframework.core.io.Resource;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configuration properties for Message Source.
|
* Configuration properties for Message Source.
|
||||||
|
|
@ -44,6 +45,11 @@ public class MessageSourceProperties {
|
||||||
*/
|
*/
|
||||||
private List<String> basename = new ArrayList<>(List.of("messages"));
|
private List<String> basename = new ArrayList<>(List.of("messages"));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comma-separated list of locale-independent common messages.
|
||||||
|
*/
|
||||||
|
private List<Resource> commonMessages;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Message bundles encoding.
|
* Message bundles encoding.
|
||||||
*/
|
*/
|
||||||
|
|
@ -123,4 +129,12 @@ public class MessageSourceProperties {
|
||||||
this.useCodeAsDefaultMessage = useCodeAsDefaultMessage;
|
this.useCodeAsDefaultMessage = useCodeAsDefaultMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Resource> getCommonMessages() {
|
||||||
|
return this.commonMessages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCommonMessages(List<Resource> commonMessages) {
|
||||||
|
this.commonMessages = commonMessages;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -116,6 +116,14 @@ class MessageSourceAutoConfigurationTests {
|
||||||
.run((context) -> assertThat(context.getMessage("foo", null, "Foo message", Locale.UK)).isEqualTo("bar"));
|
.run((context) -> assertThat(context.getMessage("foo", null, "Foo message", Locale.UK)).isEqualTo("bar"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testCommonMessages() {
|
||||||
|
this.contextRunner
|
||||||
|
.withPropertyValues("spring.messages.basename:test/messages",
|
||||||
|
"spring.messages.common-messages:test/common-messages")
|
||||||
|
.run((context) -> assertThat(context.getMessage("hello", null, "Hello!", Locale.UK)).isEqualTo("world"));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testFallbackDefault() {
|
void testFallbackDefault() {
|
||||||
this.contextRunner.withPropertyValues("spring.messages.basename:test/messages")
|
this.contextRunner.withPropertyValues("spring.messages.basename:test/messages")
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
hello=world
|
||||||
Loading…
Reference in New Issue