我只是好奇是否有人知道 JSR 354 是否会作为任何未来 JDK 的一部分正式实现。
当我在线搜索 JDK 11 文档时 - 它看起来不像Monetary并且MonetaryAmount不包含类。但是在 jsr354-ri 下的 Github 中存在 JSR 354 的实现。
如果我不想遵循参考实现,这是否意味着我可以编写自己的实现?我的目的是支持其他货币,例如没有官方 ISO 认可但众所周知的中国人民币(离岸)CNH。
谢谢,
使用新的1.0版JavaMoney API和参考实现,我们尝试通过覆盖javamoney.properties来阻止资源加载器加载其他ExchangeRateProvider.
{1}conversion.default-chain=MY-PROVIDER
# Turn off loading of the default Moneta ExchangeRateProviders.
{1}load.ECBCurrentRateProvider.type=NEVER
{1}load.ECBHistoric90RateProvider.type=NEVER
{1}load.ECBHistoricRateProvider.type=NEVER
{1}load.IMFRateProvider.type=NEVER
{1}load.AbstractECBRateProvider=NEVER
Run Code Online (Sandbox Code Playgroud)
但是,日志告诉我它们仍然被加载:
jun 19, 2015 8:27:58 AM org.javamoney.moneta.internal.convert.AbstractECBRateProvider newDataLoaded
INFO: Loaded ECBCurrentRateProvider exchange rates for days:1
Run Code Online (Sandbox Code Playgroud)
从LoaderService接口'NEVER'触发加载本地资源(而不是远程),但我也试过'LAZY'.
public interface LoaderService {
/**
* Platform RI: The update policy defines how and when the
* {@link LoaderService} tries to update the local cache with newest version of
* the registered data resources, accessing the configured remote
* {@link URI}s. By default …Run Code Online (Sandbox Code Playgroud) 我有兴趣将 JSR 354 Money API 合并到我的应用程序中,并且希望能够将 MoneyAmount 映射为可嵌入 JPA,但我们似乎无法做到这一点,因为 Moneta 实现类的无参数构造函数是私有的并且是 JPA 的(或者至少 Hibernate)需要对其进行保护。
我们尝试扩展它以提供受保护的构造函数,但该类是最终类,因此也无法这样做。
首先,假设:
我建议增强规范以要求实现为此目的提供受保护的构造函数?
其次,Moneta RI 团队是否会考虑放宽默认参数构造函数对受保护级别的访问?无论如何,如果课程是最终的,它应该不会有任何缺点?
第三,如果这种改变可能需要一段时间,那么任何人都可以同时想到一个优雅的解决方法(除了分叉我们自己的实现之外)?
给定价格点表示为整数美分的整数,即199 = $1.99是否有用于构造MonetaryAmount?的API方法?
一种简单的方法是将金额除以100,但想知道是否有一种API方法.
MonetaryAmount ma = Money.of(199, "NZD").divide(100);
Run Code Online (Sandbox Code Playgroud) 我真的很困惑如何MonetaryAmountFormat使用Moneta JSR-354实现自定义.
我的意图是能够解析两者1.23和$3.45作为MonetaryAmounts.
这是我的单元测试:
@Test
public void testString() {
Bid bid = new Bid("1.23");
assertEquals(1.23, bid.getValue(), 0.0);
System.out.println(bid);
bid = new Bid("$3.45");
assertEquals(3.45, bid.getValue(), 0.0);
System.out.println(bid);
}
Run Code Online (Sandbox Code Playgroud)
这是我的班级:
public final class Bid {
private static final CurrencyUnit USD = Monetary.getCurrency("USD");
private MonetaryAmount bid;
/**
* Constructor.
*
* @param bidStr the bid
*/
public Bid(String bidStr) {
MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(
AmountFormatQueryBuilder.of(Locale.US)
.set("pattern", "###.##")
.build());
if (StringUtils.isNotBlank(bidStr)) {
bidStr = bidStr.trim();
bidStr …Run Code Online (Sandbox Code Playgroud) 我有一个 java 项目,其 gradle 依赖项来自org.javamoney:moneta:1.3.
我还有两个 Kubernetes 集群。我使用 docker-container 部署我的 java 应用程序。
当我在第一个Kubernetes 集群中部署应用程序时,一切都很好。但是当我在第二个Kubernetes 集群中部署我的应用程序(相同的 docker-container)时,出现以下错误:
javax.money.MonetaryException: No MonetaryAmountsSingletonSpi loaded.
at javax.money.Monetary.lambda$getDefaultAmountFactory$13(Monetary.java:291)
at java.base/java.util.Optional.orElseThrow(Optional.java:408)
at javax.money.Monetary.getDefaultAmountFactory(Monetary.java:291)
Run Code Online (Sandbox Code Playgroud)
它出现在以下代码中:
javax.money.MonetaryException: No MonetaryAmountsSingletonSpi loaded.
at javax.money.Monetary.lambda$getDefaultAmountFactory$13(Monetary.java:291)
at java.base/java.util.Optional.orElseThrow(Optional.java:408)
at javax.money.Monetary.getDefaultAmountFactory(Monetary.java:291)
Run Code Online (Sandbox Code Playgroud)
1.3。6.0.1.openjdk:11.0.7-jdk-slim.2.2.7.RELEASE.Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:05:50Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}:.java -version
openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime …编辑:此问题旨在用于JSR-354上下文中的格式.另一种方法是使用java.util.CurrencyFormat.但我想知道如何使用它MonetaryAmountFormat.
如何MonetaryAmount在JSR-354的上下文中使用货币符号格式化MonetaryAmountFormat?
我尝试使用MonetaryAmountFormat我在网上找到的两个不同的例子,如下所示.这两种方法都没有正常工作所以我将我的示例测试用例推送到github,以防你想要克隆并查看完整的细节,但这里是测试:
pom.xml:
<dependency>
<groupId>org.javamoney</groupId>
<artifactId>moneta</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
TestMonetaryAmountFormat.java
package com.github.axiopisty.stackoverflow.jsr354;
import java.math.BigDecimal;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
import javax.money.CurrencyUnit;
import javax.money.Monetary;
import javax.money.MonetaryAmount;
import javax.money.format.AmountFormatQueryBuilder;
import javax.money.format.MonetaryAmountFormat;
import javax.money.format.MonetaryFormats;
import org.javamoney.moneta.Money;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestMonetaryAmountFormat {
private final String EXPECTED = "$12.99";
private final CurrencyUnit USD = Monetary.getCurrency("USD");
private final MonetaryAmount AMOUNT = Money.of(new BigDecimal("12.99"), …Run Code Online (Sandbox Code Playgroud) 为什么不javax.money.CurrencyUnit延伸java.io.Serializable?它的所有子类实现java.io.Serializable,并且最重要的是,如果你想在你的hibernate映射中使用它,那么findbugs会阻止你(非常正确)因为:
[INFO] Class com.mycompany.SiteEntity defines non-transient non-serializable instance field defaultCurrency [com.mycompany.SiteEntity] In SiteEntity.java
[INFO] Class com.mycompany.SiteEntity defines non-transient non-serializable instance field supportedCurrencies [com.mycompany.SiteEntity] In SiteEntity.java
[INFO] Class com.mycompany.UserEntity defines non-transient non-serializable instance field sessionCurrency [com.mycompany.UserEntity] In UserEntity.java
Run Code Online (Sandbox Code Playgroud)
这是否意味着必须JDKCurrencyAdapter在一个人的hibernate映射中使用该类?我更喜欢使用界面,但如果不可能,那么我将使用该类.
我有一个 POJO,其中包含一个名为price.
该字段的类型是javax.money.MonetaryAmount,以便我可以从 JSR 354 验证等中受益。
我对该字段有一个限制,指定货币必须是EUR:
@Currency("EUR")
Run Code Online (Sandbox Code Playgroud)
如何指定货币必须是EUR或USD?
import org.hibernate.annotations.Columns;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.hibernate.validator.constraints.Currency;
import org.jadira.usertype.moneyandcurrency.moneta.PersistentMoneyAmountAndCurrency;
import javax.money.MonetaryAmount;
import javax.persistence.*;
@Entity
@TypeDef(name = "persistentMoneyAmountAndCurrency", typeClass = PersistentMoneyAmountAndCurrency.class)
public class LocalizedProduct {
@Id
@GeneratedValue
private long id;
@Currency("EUR")
// @Currency("EUR, USD") .. doesn't work
@Columns(columns = {
@Column(name = "amount_currency", length = 3),
@Column(name = "amount_value", precision = 19, scale = 5)})
@Type(type = "persistentMoneyAmountAndCurrency")
private MonetaryAmount price; …Run Code Online (Sandbox Code Playgroud)