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:
Misagh Moayyed 2024-09-29 10:51:43 +04:00 committed by Phillip Webb
parent d9668672f8
commit 573ccc5007
4 changed files with 40 additions and 0 deletions

View File

@ -16,7 +16,10 @@
package org.springframework.boot.autoconfigure.context;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.time.Duration;
import java.util.Properties;
import org.springframework.aot.hint.RuntimeHints;
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.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ConcurrentReferenceHashMap;
@ -81,6 +85,19 @@ public class MessageSourceAutoConfiguration {
}
messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
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;
}

View File

@ -25,6 +25,7 @@ import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.convert.DurationUnit;
import org.springframework.core.io.Resource;
/**
* Configuration properties for Message Source.
@ -44,6 +45,11 @@ public class MessageSourceProperties {
*/
private List<String> basename = new ArrayList<>(List.of("messages"));
/**
* Comma-separated list of locale-independent common messages.
*/
private List<Resource> commonMessages;
/**
* Message bundles encoding.
*/
@ -123,4 +129,12 @@ public class MessageSourceProperties {
this.useCodeAsDefaultMessage = useCodeAsDefaultMessage;
}
public List<Resource> getCommonMessages() {
return this.commonMessages;
}
public void setCommonMessages(List<Resource> commonMessages) {
this.commonMessages = commonMessages;
}
}

View File

@ -116,6 +116,14 @@ class MessageSourceAutoConfigurationTests {
.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
void testFallbackDefault() {
this.contextRunner.withPropertyValues("spring.messages.basename:test/messages")