From c3378fda33474e1b4c40d12eb725fb5e2b3d36fe Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 18 Oct 2017 20:21:12 +0200 Subject: [PATCH] AbstractMessageSource properly interacts with non-AbstractMessageSource parent Issue: SPR-16047 --- .../support/AbstractMessageSource.java | 4 ++- .../ResourceBundleMessageSourceTests.java | 35 ++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/context/support/AbstractMessageSource.java b/spring-context/src/main/java/org/springframework/context/support/AbstractMessageSource.java index 01615eba07..78883626e6 100644 --- a/spring-context/src/main/java/org/springframework/context/support/AbstractMessageSource.java +++ b/spring-context/src/main/java/org/springframework/context/support/AbstractMessageSource.java @@ -263,7 +263,9 @@ public abstract class AbstractMessageSource extends MessageSourceSupport impleme } else { // Check parent MessageSource, returning null if not found there. - return parent.getMessage(code, args, null, locale); + // Covers custom MessageSource impls and DelegatingMessageSource. + String msg = parent.getMessage(code, args, null, locale); + return ("".equals(msg) ? null : msg); } } // Not found in parent either. diff --git a/spring-context/src/test/java/org/springframework/context/support/ResourceBundleMessageSourceTests.java b/spring-context/src/test/java/org/springframework/context/support/ResourceBundleMessageSourceTests.java index 5b864c3e83..91310213c8 100644 --- a/spring-context/src/test/java/org/springframework/context/support/ResourceBundleMessageSourceTests.java +++ b/spring-context/src/test/java/org/springframework/context/support/ResourceBundleMessageSourceTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -210,6 +210,39 @@ public class ResourceBundleMessageSourceTests { assertEquals("default value", ac.getMessage("code1", new Object[] {"value"}, "default {0}", Locale.ENGLISH)); } + @Test + public void testDefaultApplicationContextMessageSourceWithParent() { + GenericApplicationContext ac = new GenericApplicationContext(); + GenericApplicationContext parent = new GenericApplicationContext(); + parent.refresh(); + ac.setParent(parent); + ac.refresh(); + assertEquals("default", ac.getMessage("code1", null, "default", Locale.ENGLISH)); + assertEquals("default value", ac.getMessage("code1", new Object[] {"value"}, "default {0}", Locale.ENGLISH)); + } + + @Test + public void testStaticApplicationContextMessageSourceWithStaticParent() { + StaticApplicationContext ac = new StaticApplicationContext(); + StaticApplicationContext parent = new StaticApplicationContext(); + parent.refresh(); + ac.setParent(parent); + ac.refresh(); + assertEquals("default", ac.getMessage("code1", null, "default", Locale.ENGLISH)); + assertEquals("default value", ac.getMessage("code1", new Object[] {"value"}, "default {0}", Locale.ENGLISH)); + } + + @Test + public void testStaticApplicationContextMessageSourceWithDefaultParent() { + StaticApplicationContext ac = new StaticApplicationContext(); + GenericApplicationContext parent = new GenericApplicationContext(); + parent.refresh(); + ac.setParent(parent); + ac.refresh(); + assertEquals("default", ac.getMessage("code1", null, "default", Locale.ENGLISH)); + assertEquals("default value", ac.getMessage("code1", new Object[] {"value"}, "default {0}", Locale.ENGLISH)); + } + @Test public void testResourceBundleMessageSourceStandalone() { ResourceBundleMessageSource ms = new ResourceBundleMessageSource();