2013-09-09 5 views
0

У меня есть приложение, использующее этот класс: java.util.CurrencyПочему java.util.Currency.getDisplayName() возвращение нулевой

В приложении, я поддерживаю карту кодов стран в регионы. Я получаю языковой стандарт, проезжая код страны

Когда я передаю этот языковой стандарт до Currency.getInstance(), он возвращает правильную валюту. Я проверил, что по телефону Currency.getCurrencyCode()

Однако, когда я называю getDisplayName() на том же экземпляре валюты, она возвращает null

Такое поведение не происходит на моей Dev машине, только на моем тестовом сервере

И мой Dev машины и использовать сервер Ubuntu 12.04 LTS с:

java version "1.6.0_27" 
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu0.12.04.2) 
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode) 

запускает приложение внутри котом

я мог бы что-то здесь

редактировать

import java.util.Currency; 
import java.util.HashMap; 
import java.util.Locale; 
import java.util.Map; 

...

public static Map<String, Locale> COUNTRY_TO_LOCALE_MAP; 

public static void initCountryToLocaleMap() { 
    if (COUNTRY_TO_LOCALE_MAP != null) { 
     return; 
    } 

    COUNTRY_TO_LOCALE_MAP = new HashMap<String, Locale>(); 

    Locale[] locales = Locale.getAvailableLocales(); 

    for (Locale l : locales) { 
     COUNTRY_TO_LOCALE_MAP.put(l.getCountry(), l); 
    } 
} 

public static Locale getLocaleFromCountryCode(String countryCode) { 
    if (countryCode == null) { 
     return null; 
    } 

    initCountryToLocaleMap(); 

    Locale locale = COUNTRY_TO_LOCALE_MAP.get(countryCode); 

    if (locale == null) { 
     return new Locale("", countryCode); 
    } 

    return locale; 
} 

public static void main(String args[]) { 
    initCountryToLocaleMap(); 

    String countryCode = "ZA"; 
    Locale locale = getLocaleFromCountryCode(countryCode); 
    Currency currency = Currency.getInstance(locale); 

    System.out.println("currencyCode: " + currency.getCurrencyCode()); 
    System.out.println("displayName: " + currency.getDisplayName()); 
} 

отсутствует После запуска основной(), я получил следующий вывод: от Dev машины:

currencyCode: ZAR 
displayName: South African Rand 

с тестового сервера:

currencyCode: ZAR 
+1

Просьба указать код.Мы не можем помочь вам, если вы не найдете что-то конкретное, чтобы посмотреть на – StormeHawke

+0

проверить локаль по умолчанию на обоих ваших серверах (DEV и TEST) –

+0

Вы уверены, что ваш разработчик и тестовая машина используют ту же версию JDK? –

ответ

0

javadoc для класса валюты указывает, что метод getDisplayName() нового в версии 1.7 Java. Попробуйте запустить Tomcat с версией 1.7 JDK.

Я был бы удивлен, если Tomcat просто молчал и возвращает null. Вы проверили журналы Tomcat, чтобы узнать, есть ли какие-либо исключения?

+0

Странно. Не следует ли это бросать 'NoSuchMethodError', потому что метод не найден или' UnsupportedClassVersionError', так как один пытался запустить файл класса 1.7 с Java 1.6? – gparyani

+0

Да, именно поэтому я попросил его проверить журналы. –

0

Вы звоните:

Locale.getAvailableLocales(); 

Для заполнения вы COUNTRY_TO_LOCALE_MAP карты с ключом как country и значением как Locale.

Проблема в том, что между всеми странами мира и локациями нет однозначного соответствия., например. Вы получите много локальных записей с пустым country в списке. Из-за этого вы вставляете пустую клавишу несколько раз на свою карту.

И да, страна, в которую вы смотрите ZA, также не возвращается. Именно по этой причине вы возвращаете null.

Местные жители представляют собой регионы. Они предназначены для обозначения таких вещей, как язык, валюта и т. Д.

+0

Как это объясняет, почему он получает другой результат от разработчика и тестовой машины? –

+0

'ZA', не имеющий какой-либо записи в списке' Locale', действительно является причиной для 'Why is java.util.Currency.getDisplayName() возвращает null'. Различные установки могут возвращать различные настройки Locale. – anubhava

+0

И почему он не возвращает null при запуске с другого сервера? –