我有一个使用 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 正在使用中,我认为这是正确的。
我已经重新启动了我的开发环境,以防系统语言环境设置变得有趣(但鉴于单元测试有效,这无论如何都没有意义)。
任何提示都将不胜感激。