Skip to content

Commit a9b64dc

Browse files
committed
Allow common messages to be specified for message sources
Extend the configuration schema to support the specification of common messages, when defining a messageSource bean
1 parent bc5a718 commit a9b64dc

File tree

4 files changed

+46
-0
lines changed

4 files changed

+46
-0
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/context/MessageSourceAutoConfiguration.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,16 @@
1616

1717
package org.springframework.boot.autoconfigure.context;
1818

19+
import java.io.IOException;
20+
import java.io.UncheckedIOException;
1921
import java.time.Duration;
22+
import java.util.Arrays;
23+
import java.util.List;
24+
import java.util.stream.Collectors;
2025

2126
import org.springframework.aot.hint.RuntimeHints;
2227
import org.springframework.aot.hint.RuntimeHintsRegistrar;
28+
import org.springframework.beans.factory.config.PropertiesFactoryBean;
2329
import org.springframework.boot.autoconfigure.AutoConfiguration;
2430
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
2531
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -39,7 +45,9 @@
3945
import org.springframework.context.support.AbstractApplicationContext;
4046
import org.springframework.context.support.ResourceBundleMessageSource;
4147
import org.springframework.core.Ordered;
48+
import org.springframework.core.io.DefaultResourceLoader;
4249
import org.springframework.core.io.Resource;
50+
import org.springframework.core.io.ResourceLoader;
4351
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
4452
import org.springframework.core.type.AnnotatedTypeMetadata;
4553
import org.springframework.util.ConcurrentReferenceHashMap;
@@ -81,6 +89,25 @@ public MessageSource messageSource(MessageSourceProperties properties) {
8189
}
8290
messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
8391
messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
92+
93+
try {
94+
if (StringUtils.hasText(properties.getCommonMessages())) {
95+
PropertiesFactoryBean propertiesFactory = new PropertiesFactoryBean();
96+
ResourceLoader resourceLoader = new DefaultResourceLoader();
97+
String[] commonMessages = StringUtils.commaDelimitedListToStringArray(
98+
StringUtils.trimAllWhitespace(properties.getCommonMessages()));
99+
List<Resource> commonResources = Arrays.stream(commonMessages)
100+
.map(resourceLoader::getResource)
101+
.toList();
102+
propertiesFactory.setLocations(commonResources.toArray(Resource[]::new));
103+
propertiesFactory.setSingleton(true);
104+
propertiesFactory.setIgnoreResourceNotFound(true);
105+
propertiesFactory.afterPropertiesSet();
106+
messageSource.setCommonMessages(propertiesFactory.getObject());
107+
}
108+
} catch (IOException e) {
109+
throw new UncheckedIOException("Failed to load common messages", e);
110+
}
84111
return messageSource;
85112
}
86113

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/context/MessageSourceProperties.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ public class MessageSourceProperties {
4242
*/
4343
private String basename = "messages";
4444

45+
/**
46+
* Comma-separated list of locale-independent common messages.
47+
*/
48+
private String commonMessages;
49+
4550
/**
4651
* Message bundles encoding.
4752
*/
@@ -121,4 +126,11 @@ public void setUseCodeAsDefaultMessage(boolean useCodeAsDefaultMessage) {
121126
this.useCodeAsDefaultMessage = useCodeAsDefaultMessage;
122127
}
123128

129+
public String getCommonMessages() {
130+
return this.commonMessages;
131+
}
132+
133+
public void setCommonMessages(String commonMessages) {
134+
this.commonMessages = commonMessages;
135+
}
124136
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/context/MessageSourceAutoConfigurationTests.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@ void testMessageSourceFromPropertySourceAnnotation() {
116116
.run((context) -> assertThat(context.getMessage("foo", null, "Foo message", Locale.UK)).isEqualTo("bar"));
117117
}
118118

119+
@Test
120+
void testCommonMessages() {
121+
this.contextRunner.withPropertyValues("spring.messages.basename:test/messages", "spring.messages.common-messages:test/common-messages")
122+
.run((context) -> assertThat(context.getMessage("hello", null, "Hello!", Locale.UK)).isEqualTo("world"));
123+
}
124+
119125
@Test
120126
void testFallbackDefault() {
121127
this.contextRunner.withPropertyValues("spring.messages.basename:test/messages")
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
hello=world

0 commit comments

Comments
 (0)