我只是好奇是否有人知道 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 团队是否会考虑放宽默认参数构造函数对受保护级别的访问?无论如何,如果课程是最终的,它应该不会有任何缺点?
第三,如果这种改变可能需要一段时间,那么任何人都可以同时想到一个优雅的解决方法(除了分叉我们自己的实现之外)?
我有一个下游服务 (Stripe),它要求我以最小的货币单位(他们的文档中的零十进制货币)发送货币。即收取 $1 我会发送 { "currency": "USD", amount: 100 } 并收取 ¥100 我会发送 { "currency": "YEN", amount: 100 }
我的上游应用程序不想以这种方式处理货币并希望使用标准货币格式。有没有办法转换javax.money.MonetaryAmount成零十进制货币格式?
还是我必须手动编写转换?
使用 JSR-354 Java Money API(本例中为 Moneta),我可以轻松地MonetaryAmount从long小单位(本例中为便士)创建一个对象:
MonetaryAmount amount = Money.ofMinor(Monetary.getCurrency("GBP"), 1234); //\xc2\xa312.34\nRun Code Online (Sandbox Code Playgroud)\n\n...但是我如何以同样的方式查询它的次要单位呢MonetaryAmount ?我可以:
amount.getNumber().longValue();\nRun Code Online (Sandbox Code Playgroud)\n\n...但这只给出了主要单位,完全截断了次要单位。
\n给定价格点表示为整数美分的整数,即199 = $1.99是否有用于构造MonetaryAmount?的API方法?
一种简单的方法是将金额除以100,但想知道是否有一种API方法.
MonetaryAmount ma = Money.of(199, "NZD").divide(100);
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 …在 pom.xml 中添加的依赖项:
<dependency>
<groupId>javax.money</groupId>
<artifactId>money-api</artifactId>
<version>1.0.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
相关代码:
MonetaryAmount mon = Monetary.getDefaultAmountFactory()
//getCurrency() returns String
.setCurrency(amount.getCurrency())
//getContent() returns BigDecimal
.setNumber(amount.getContent())
.create();
Run Code Online (Sandbox Code Playgroud)
单元测试时我得到这个异常:
javax.money.MonetaryException: No MonetaryAmountsSingletonSpi loaded.
at javax.money.Monetary.lambda$getDefaultAmountFactory$13(Monetary.java:291)
Run Code Online (Sandbox Code Playgroud) CurrencyUnit我有一个 pojo,它有一个来自 javamoney 库的类型字段。当我编组这个 pojo 时,杰克逊抛出了一个异常。我记得当我没有定义任何默认构造函数时出现此异常。但在这种情况下,我无法维护该类,CurrencyUnit因为它来自依赖项。我怎样才能继续这项工作?
例外:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `javax.money.CurrencyUnit` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information\n at
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)