Skip to content

Commit 486a063

Browse files
committed
Merge pull request #13377 from ruifigueira
* pr/13377: Polish "Add ReloadableResourceBundleMessageSource support" Add ReloadableResourceBundleMessageSource support
2 parents 8b59503 + 11ac9bf commit 486a063

File tree

4 files changed

+55
-1
lines changed

4 files changed

+55
-1
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import org.springframework.context.annotation.ConditionContext;
3434
import org.springframework.context.annotation.Conditional;
3535
import org.springframework.context.annotation.Configuration;
36+
import org.springframework.context.support.AbstractResourceBasedMessageSource;
37+
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
3638
import org.springframework.context.support.ResourceBundleMessageSource;
3739
import org.springframework.core.Ordered;
3840
import org.springframework.core.io.Resource;
@@ -65,7 +67,9 @@ public MessageSourceProperties messageSourceProperties() {
6567

6668
@Bean
6769
public MessageSource messageSource(MessageSourceProperties properties) {
68-
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
70+
AbstractResourceBasedMessageSource messageSource = (properties.isReloadable()
71+
? new ReloadableResourceBundleMessageSource()
72+
: new ResourceBundleMessageSource());
6973
if (StringUtils.hasText(properties.getBasename())) {
7074
messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(
7175
StringUtils.trimAllWhitespace(properties.getBasename())));

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ public class MessageSourceProperties {
7171
*/
7272
private boolean useCodeAsDefaultMessage = false;
7373

74+
/**
75+
* Whether to use a "ReloadableResourceBundleMessageSource" rather than the default
76+
* "ResourceBundleMessageSource". Recommended during development only.
77+
*/
78+
private boolean reloadable = false;
79+
7480
public String getBasename() {
7581
return this.basename;
7682
}
@@ -119,4 +125,12 @@ public void setUseCodeAsDefaultMessage(boolean useCodeAsDefaultMessage) {
119125
this.useCodeAsDefaultMessage = useCodeAsDefaultMessage;
120126
}
121127

128+
public boolean isReloadable() {
129+
return this.reloadable;
130+
}
131+
132+
public void setReloadable(boolean reloadable) {
133+
this.reloadable = reloadable;
134+
}
135+
122136
}

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
import org.springframework.context.annotation.Bean;
3333
import org.springframework.context.annotation.Configuration;
3434
import org.springframework.context.annotation.PropertySource;
35+
import org.springframework.context.support.DelegatingMessageSource;
36+
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
37+
import org.springframework.context.support.ResourceBundleMessageSource;
3538

3639
import static org.assertj.core.api.Assertions.assertThat;
3740

@@ -220,6 +223,38 @@ public void existingMessageSourceInParentIsIgnored() {
220223
.isEqualTo("bar")));
221224
}
222225

226+
@Test
227+
public void testDefaultReloadableValueMessageSource() {
228+
testReloadableMessageSource(ResourceBundleMessageSource.class,
229+
"spring.messages.basename:test/messages");
230+
}
231+
232+
@Test
233+
public void testNotReloadableMessageSource() {
234+
testReloadableMessageSource(ResourceBundleMessageSource.class,
235+
"spring.messages.basename:test/messages",
236+
"spring.messages.reloadable:false");
237+
}
238+
239+
@Test
240+
public void testReloadableMessageSource() {
241+
testReloadableMessageSource(ReloadableResourceBundleMessageSource.class,
242+
"spring.messages.basename:test/messages",
243+
"spring.messages.reloadable:true");
244+
}
245+
246+
private void testReloadableMessageSource(Class<?> expectedInstance,
247+
String... propertyValues) {
248+
this.contextRunner.withPropertyValues(propertyValues).run((context) -> {
249+
MessageSource messageSource = context.getBean(MessageSource.class);
250+
if (messageSource instanceof DelegatingMessageSource) {
251+
messageSource = ((DelegatingMessageSource) messageSource)
252+
.getParentMessageSource();
253+
}
254+
assertThat(messageSource).isInstanceOf(expectedInstance);
255+
});
256+
}
257+
223258
@Configuration
224259
@PropertySource("classpath:/switch-messages.properties")
225260
protected static class Config {

spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ content into your application. Rather, pick only the properties that you need.
133133
spring.messages.cache-duration= # Loaded resource bundle files cache duration. When not set, bundles are cached forever. If a duration suffix is not specified, seconds will be used.
134134
spring.messages.encoding=UTF-8 # Message bundles encoding.
135135
spring.messages.fallback-to-system-locale=true # Whether to fall back to the system Locale if no files for a specific Locale have been found.
136+
spring.messages.reloadable=false # Whether to use a ReloadableResourceBundleMessageSource instead of the default ResourceBundleMessageSource. Recommended during development only.
136137
spring.messages.use-code-as-default-message=false # Whether to use the message code as the default message instead of throwing a "NoSuchMessageException". Recommended during development only.
137138
138139
# OUTPUT

0 commit comments

Comments
 (0)