0

我有一个使用 tomcat 8 和 java 8 的现有 servlet 应用程序。我使用 org.javamoney.moneta.Money 有一段时间了。

今天我想添加一个新模式,我开始收到以下异常:

javax.money.MonetaryException: No MonetaryAmountFormat for 
AmountFormatQuery AmountFormatQuery (
{pattern=$0.00, Query.formatName=default, 
org.javamoney.moneta.format.CurrencyStyle=NAME, java.util.Locale=en})
at javax.money.spi.MonetaryFormatsSingletonSpi.getAmountFormat(MonetaryFormats
SingletonSpi.java:71) ~[money-api-1.0.3.jar:1.0.3]
at javax.money.format.MonetaryFormats.getAmountFormat(MonetaryFormats.java:112) ~[money-api-1.0.3.jar:1.0.3]
    at au.org.noojee.auditor.util.Formatters.format(Formatters.java:92) ~[classes/:?]
at au.org.noojee.auditor.util.Formatters.format(Formatters.java:81) ~[classes/:?]
at au.org.noojee.auditor.entities.Customer.getNotices(Customer.java:242) ~[classes/:?]
at au.org.noojee.auditor.entities.Customer.getWorstError(Customer.java:307) ~[classes/:?]

所以我恢复到原来的模式,但异常仍在继续。

我已经跟踪了代码,问题似乎源于以下对 getServices 的调用返回一个空列表的事实。

Bootstrap.getServices(MonetaryAmountFormatProviderSpi.class) 

所以奇怪的是,如果我在同一个项目中设置单元测试一切正常。

我现在已经升级到money 1.3,但我遇到了同样的错误(并且单元测试仍然有效)。

失败的代码(在tomcat下运行时)是:

注意:我对金额进行了硬编码,以防传递的 money1 引起问题(但当然,在使用之前抛出异常,因此无论如何都不是问题)。

public static String format(Money money1, String pattern)
{
    MonetaryAmount money = Money.of(12345.67, "AUD");
    MonetaryAmountFormat customFormat = MonetaryFormats.getAmountFormat(
            AmountFormatQueryBuilder.of(Locale.ENGLISH)
            .set(CurrencyStyle.NAME)
            .set("pattern", "$0.00")
            .build()); 


    String result;
    if (money == null)
        result = "";
    else
        result = customFormat.format(money);
    return result;

}

有效的单元测试是:

static public final CurrencyUnit LOCAL_CURRENCY = Monetary.getCurrency(Locale.getDefault());

@Test
public void test()
{
    MonetaryAmount amount = Money.of(12345.67, "AUD");
    MonetaryAmountFormat customFormat = MonetaryFormats.getAmountFormat(
            AmountFormatQueryBuilder.of(Locale.ENGLISH)
            .set(CurrencyStyle.NAME)
            .set("pattern", "$0.00")
            .build()); 

            String formatted = customFormat.format(amount); //00,01,23,45.67 US Dollar
            System.out.println(formatted);
}

注意:对 getCurrency 的调用也在 tomcat servlet 应用程序中,但在不同的类中。我已经在有和没有这条线的情况下运行了单元测试,但没有区别。

我检查了我的 pom 以防有任何冲突,但它报告我认为 moneta 1.3 和 money-api 1.0.3 正在使用中,我认为这是正确的。

我已经重新启动了我的开发环境,以防系统语言环境设置变得有趣(但鉴于单元测试有效,这无论如何都没有意义)。

任何提示都将不胜感激。

4

1 回答 1

0

不是解决方案,但我确实开发了一种解决方法:

public static String format(Money money)
{
    long cents = money.scaleByPowerOfTen(2).getNumber().longValueExact();

    return String.format("$%,1d.%02d", cents / 100, cents % 100);

}

结果:

MonetaryAmount amount = Money.of(99999125.67, "AUD");

System.out.println(format(amount));

99,999,125.67 美元

于 2018-07-17T23:27:48.013 回答