标签: jsr354

Java 的货币和货币操作 - JSR 354

我只是好奇是否有人知道 JSR 354 是否会作为任何未来 JDK 的一部分正式实现。

当我在线搜索 JDK 11 文档时 - 它看起来不像Monetary并且MonetaryAmount不包含类。但是在 jsr354-ri 下的 Github 中存在 JSR 354 的实现。

如果我不想遵循参考实现,这是否意味着我可以编写自己的实现?我的目的是支持其他货币,例如没有官方 ISO 认可但众所周知的中国人民币(离岸)CNH。

谢谢,

jsr354 java-money

7
推荐指数
2
解决办法
1822
查看次数

覆盖javamoney.properties中的属性?

使用新的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)

java jsr354 java-money

6
推荐指数
1
解决办法
605
查看次数

货币金额的 JPA 映射

我有兴趣将 JSR 354 Money API 合并到我的应用程序中,并且希望能够将 MoneyAmount 映射为可嵌入 JPA,但我们似乎无法做到这一点,因为 Moneta 实现类的无参数构造函数是私有的并且是 JPA 的(或者至少 Hibernate)需要对其进行保护。

我们尝试扩展它以提供受保护的构造函数,但该类是最终类,因此也无法这样做。

首先,假设:

  1. 我不是唯一一个可能想这样做的人
  2. 与 JPA 的互操作性对此 JSR 很重要

我建议增强规范以要求实现为此目的提供受保护的构造函数?

其次,Moneta RI 团队是否会考虑放宽默认参数构造函数对受保护级别的访问?无论如何,如果课程是最终的,它应该不会有任何缺点?

第三,如果这种改变可能需要一段时间,那么任何人都可以同时想到一个优雅的解决方法(除了分叉我们自己的实现之外)?

hibernate jsr354 java-money

6
推荐指数
1
解决办法
2174
查看次数

有没有办法从整分钱价值构建MonetaryAmount?

给定价格点表示为整数美分的整数,即199 = $1.99是否有用于构造MonetaryAmount?的API方法?

一种简单的方法是将金额除以100,但想知道是否有一种API方法.

MonetaryAmount ma = Money.of(199, "NZD").divide(100);
Run Code Online (Sandbox Code Playgroud)

java jsr354 java-money

4
推荐指数
1
解决办法
366
查看次数

使用Moneta(JavaMoney)JSR354实现自定义MonetaryAmountFormat

我真的很困惑如何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 jsr354

4
推荐指数
1
解决办法
770
查看次数

MonetaryException:未加载 MonetaryAmountsSingletonSpi

问题描述

我有一个 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.
  • 基础 docker-image: openjdk:11.0.7-jdk-slim.
  • 弹簧靴:2.2.7.RELEASE.
  • Kubernetes(两个集群上的版本相同)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 …

java spring gradle jsr354 java-money

4
推荐指数
1
解决办法
1099
查看次数

如何使用货币符号格式化MonetaryAmount?

编辑:此问题旨在用于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)

java jsr354

2
推荐指数
1
解决办法
1631
查看次数

为什么javax.money.CurrencyUnit不能序列化?

为什么不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映射中使用该类?我更喜欢使用界面,但如果不可能,那么我将使用该类.

java hibernate jsr354 java-money

1
推荐指数
1
解决办法
376
查看次数

验证货币代码与允许的值之一匹配

我有一个 POJO,其中包含一个名为price.

该字段的类型是javax.money.MonetaryAmount,以便我可以从 JSR 354 验证等中受益。

我对该字段有一个限制,指定货币必须是EUR

@Currency("EUR")
Run Code Online (Sandbox Code Playgroud)

如何指定货币必须是EURUSD

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)

java validation jsr354 java-money

0
推荐指数
1
解决办法
164
查看次数

标签 统计

jsr354 ×9

java ×7

java-money ×7

hibernate ×2

gradle ×1

spring ×1

validation ×1