Commit 7b3bedc4 authored by Stephane Nicoll's avatar Stephane Nicoll

Fix detection of dot-based resource bundle basenames

This commit makes sure that properties-based resource bundle location
with a dot is detected. It also harmonizes the description of the
configuration key as our support is not stricly matching the convention.

Closes gh-10092
parent 8255835c
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -59,9 +59,10 @@ public class MessageSourceAutoConfiguration { ...@@ -59,9 +59,10 @@ public class MessageSourceAutoConfiguration {
private static final Resource[] NO_RESOURCES = {}; private static final Resource[] NO_RESOURCES = {};
/** /**
* Comma-separated list of basenames, each following the ResourceBundle convention. * Comma-separated list of basenames (essentially a fully-qualified classpath
* Essentially a fully-qualified classpath location. If it doesn't contain a package * location), each following the ResourceBundle convention with relaxed support for
* qualifier (such as "org.mypackage"), it will be resolved from the classpath root. * slash based locations. If it doesn't contain a package qualifier (such as
* "org.mypackage"), it will be resolved from the classpath root.
*/ */
private String basename = "messages"; private String basename = "messages";
...@@ -180,9 +181,10 @@ public class MessageSourceAutoConfiguration { ...@@ -180,9 +181,10 @@ public class MessageSourceAutoConfiguration {
} }
private Resource[] getResources(ClassLoader classLoader, String name) { private Resource[] getResources(ClassLoader classLoader, String name) {
String target = name.replace('.', '/');
try { try {
return new PathMatchingResourcePatternResolver(classLoader) return new PathMatchingResourcePatternResolver(classLoader)
.getResources("classpath*:" + name + ".properties"); .getResources("classpath*:" + target + ".properties");
} }
catch (Exception ex) { catch (Exception ex) {
return NO_RESOURCES; return NO_RESOURCES;
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -60,8 +60,17 @@ public class MessageSourceAutoConfigurationTests { ...@@ -60,8 +60,17 @@ public class MessageSourceAutoConfigurationTests {
} }
@Test @Test
public void testMessageSourceCreated() throws Exception { public void propertiesBundleWithSlashIsDetected() {
load("spring.messages.basename:test/messages"); load("spring.messages.basename:test/messages");
assertThat(this.context.getBeansOfType(MessageSource.class)).hasSize(1);
assertThat(this.context.getMessage("foo", null, "Foo message", Locale.UK))
.isEqualTo("bar");
}
@Test
public void propertiesBundleWithDotIsDetected() {
load("spring.messages.basename:test.messages");
assertThat(this.context.getBeansOfType(MessageSource.class)).hasSize(1);
assertThat(this.context.getMessage("foo", null, "Foo message", Locale.UK)) assertThat(this.context.getMessage("foo", null, "Foo message", Locale.UK))
.isEqualTo("bar"); .isEqualTo("bar");
} }
......
...@@ -114,7 +114,7 @@ content into your application; rather pick only the properties that you need. ...@@ -114,7 +114,7 @@ content into your application; rather pick only the properties that you need.
# INTERNATIONALIZATION ({sc-spring-boot-autoconfigure}/context/MessageSourceAutoConfiguration.{sc-ext}[MessageSourceAutoConfiguration]) # INTERNATIONALIZATION ({sc-spring-boot-autoconfigure}/context/MessageSourceAutoConfiguration.{sc-ext}[MessageSourceAutoConfiguration])
spring.messages.always-use-message-format=false # Set whether to always apply the MessageFormat rules, parsing even messages without arguments. spring.messages.always-use-message-format=false # Set whether to always apply the MessageFormat rules, parsing even messages without arguments.
spring.messages.basename=messages # Comma-separated list of basenames, each following the ResourceBundle convention. spring.messages.basename=messages # Comma-separated list of basenames (essentially a fully-qualified classpath location), each following the ResourceBundle convention with relaxed support for slash based locations.
spring.messages.cache-seconds=-1 # Loaded resource bundle files cache expiration, in seconds. When set to -1, bundles are cached forever. spring.messages.cache-seconds=-1 # Loaded resource bundle files cache expiration, in seconds. When set to -1, bundles are cached forever.
spring.messages.encoding=UTF-8 # Message bundles encoding. spring.messages.encoding=UTF-8 # Message bundles encoding.
spring.messages.fallback-to-system-locale=true # Set whether to fall back to the system Locale if no files for a specific Locale have been found. spring.messages.fallback-to-system-locale=true # Set whether to fall back to the system Locale if no files for a specific Locale have been found.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment