Skip to content

Commit 1807992

Browse files
authored
BAEL-4209: Difference between e.getMessage() and e.getLocalizedMessage() (eugenp#10222)
* - initial commit of sample code * BAEL-4209: Moving the localized exception module into core-java-exceptions-3. * BAEL-4209: Removed the old files for localizing exception messages.
1 parent 897f819 commit 1807992

6 files changed

Lines changed: 162 additions & 0 deletions

File tree

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.baeldung.exceptions.localization;
2+
3+
import java.util.Locale;
4+
5+
public class LocalizedException extends Exception {
6+
7+
private static final long serialVersionUID = 1L;
8+
9+
private final String messageKey;
10+
private final Locale locale;
11+
12+
public LocalizedException(String messageKey) {
13+
this(messageKey, Locale.getDefault());
14+
}
15+
16+
public LocalizedException(String messageKey, Locale locale) {
17+
this.messageKey = messageKey;
18+
this.locale = locale;
19+
}
20+
21+
/**
22+
* @return a localized message based on the messageKey provided at instantiation.
23+
*/
24+
public String getMessage() {
25+
26+
/*
27+
* This is a deliberate role reversal of the default implementation of getLocalizedMessage.
28+
* some logging frameworks like Log4J 1 & 2 and Logback will use getMessage instead of
29+
* getLocalizedMessage when logging Throwables. If we want to use these frameworks in client
30+
* applications to log localized messages, then we'll need to override getMessage in a
31+
* similar fashion to return the appropriate content. Or, you can call getLocalizedMessage
32+
* on your own to create the log content.
33+
*/
34+
return getLocalizedMessage();
35+
}
36+
37+
/**
38+
* @return a localized message based on the messageKey provided at instantiation.
39+
*/
40+
public String getLocalizedMessage() {
41+
42+
/*
43+
* java.util.logging uses getLocalizedMessage when logging Throwables.
44+
*/
45+
return Messages.getMessageForLocale(messageKey, locale);
46+
}
47+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.baeldung.exceptions.localization;
2+
3+
import java.util.Locale;
4+
import java.util.ResourceBundle;
5+
6+
public class Messages {
7+
8+
/**
9+
* Retrieves the value for the messageKey from the locale-specific messages.properties, or from
10+
* the base messages.properties for unsupported locales.
11+
*
12+
* @param messageKey The key for the message in the messages.properties ResourceBundle.
13+
* @param locale The locale to search the message key.
14+
* @return The value defined for the messageKey in the provided locale.
15+
*/
16+
public static String getMessageForLocale(String messageKey, Locale locale) {
17+
18+
/*
19+
* For more complex implementations, you will want a var-args parameter for MessageFormat
20+
* substitutions. Then we can read the value from the bundle and pass the value with the
21+
* substitutions to MessageFormat to create the final message value.
22+
*/
23+
return ResourceBundle.getBundle("messages", locale)
24+
.getString(messageKey);
25+
}
26+
27+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
message.exception = I am an exception.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
message.exception = Je suis une exception.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.baeldung.exceptions.localization;
2+
3+
import org.junit.After;
4+
import org.junit.Before;
5+
import org.junit.Test;
6+
7+
import java.util.Locale;
8+
9+
import static org.assertj.core.api.Assertions.assertThat;
10+
11+
public class LocalizedExceptionUnitTest {
12+
13+
private Locale originalDefaultLocale;
14+
15+
@Before
16+
public void saveOriginalDefaultLocale() {
17+
originalDefaultLocale = Locale.getDefault();
18+
}
19+
20+
@After
21+
public void restoreOriginalDefaultLocale() {
22+
Locale.setDefault(originalDefaultLocale);
23+
}
24+
25+
@Test
26+
public void givenUsEnglishDefaultLocale_whenLocalizingMessage_thenMessageComesFromDefaultMessages() {
27+
Locale.setDefault(Locale.US);
28+
29+
LocalizedException localizedException = new LocalizedException("message.exception");
30+
String usEnglishLocalizedExceptionMessage = localizedException.getLocalizedMessage();
31+
32+
assertThat(usEnglishLocalizedExceptionMessage).isEqualTo("I am an exception.");
33+
}
34+
35+
@Test
36+
public void givenFranceFrenchDefaultLocale_whenLocalizingMessage_thenMessageComesFromFrenchTranslationMessages() {
37+
Locale.setDefault(Locale.FRANCE);
38+
39+
LocalizedException localizedException = new LocalizedException("message.exception");
40+
String franceFrenchLocalizedExceptionMessage = localizedException.getLocalizedMessage();
41+
42+
assertThat(franceFrenchLocalizedExceptionMessage).isEqualTo("Je suis une exception.");
43+
}
44+
45+
@Test
46+
public void givenUsEnglishProvidedLocale_whenLocalizingMessage_thenMessageComesFromDefaultMessage() {
47+
LocalizedException localizedException = new LocalizedException("message.exception", Locale.US);
48+
String usEnglishLocalizedExceptionMessage = localizedException.getLocalizedMessage();
49+
50+
assertThat(usEnglishLocalizedExceptionMessage).isEqualTo("I am an exception.");
51+
}
52+
53+
@Test
54+
public void givenFranceFrenchProvidedLocale_whenLocalizingMessage_thenMessageComesFromFrenchTranslationMessages() {
55+
LocalizedException localizedException = new LocalizedException("message.exception", Locale.FRANCE);
56+
String franceFrenchLocalizedExceptionMessage = localizedException.getLocalizedMessage();
57+
58+
assertThat(franceFrenchLocalizedExceptionMessage).isEqualTo("Je suis une exception.");
59+
}
60+
61+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.baeldung.exceptions.localization;
2+
3+
import org.junit.Test;
4+
5+
import java.util.Locale;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
public class MessagesUnitTest {
10+
11+
@Test
12+
public void givenUsEnglishLocale_whenRetrievingMessage_thenEnglishTranslationIsReturned() {
13+
String translatedMessage = Messages.getMessageForLocale("message.exception", Locale.US);
14+
15+
assertThat(translatedMessage).isEqualTo("I am an exception.");
16+
}
17+
18+
@Test
19+
public void givenFranceFrenchLocale_whenRetrievingMessage_thenFrenchTranslationIsReturned() {
20+
String translatedMessage = Messages.getMessageForLocale("message.exception", Locale.FRANCE);
21+
22+
assertThat(translatedMessage).isEqualTo("Je suis une exception.");
23+
}
24+
25+
}

0 commit comments

Comments
 (0)