2017-09-11 2 views
2

J'essaie d'obtenir le taux de change à une date précise entre EUR et USD. Le problème est que je suis toujours obtenir l'échange d'os pour la date: LocalDate{year=2016, month=1, dayOfMonth=8} et ce n'est pas grave si je spécifie la date dans la requête.Java Money - taux de change à une date précise

Voici mes dépendances maven:

 <dependency> 
      <groupId>javax.money</groupId> 
      <artifactId>money-api-bp</artifactId> 
      <version>1.0.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.javamoney</groupId> 
      <artifactId>moneta-bp</artifactId> 
      <version>1.1</version> 
     </dependency> 

code source:

public class Test { 
    public static void main(String[] args) { 
     ConversionQuery query = ConversionQueryBuilder.of() 
       .setProviderName("ECB") 
       .setBaseCurrency(Monetary.getCurrency("EUR")) 
       .setTermCurrency(Monetary.getCurrency("USD")) 
       .set(LocalDate.class, LocalDate.of(2017, Month.SEPTEMBER, 10)) 
       .build(); 
     final ExchangeRateProvider provider = getExchangeRateProvider(query); 
     final ExchangeRate rate1 = provider.getExchangeRate(query); 
     System.out.println(rate1); 

     ExchangeRateProvider ecbExchangeRateProvider = MonetaryConversions.getExchangeRateProvider("ECB"); 
     ExchangeRate rate = ecbExchangeRateProvider.getExchangeRate("EUR", "USD"); 
     System.out.println(rate); 

    } 
} 

Et la sortie de sout:

sep. 11, 2017 9:58:29 AM org.javamoney.moneta.internal.convert.ECBAbstractRateProvider newDataLoaded 
INFO: Loaded ECBCurrentRateProvider exchange rates for days:1 
sep. 11, 2017 9:58:30 AM org.javamoney.moneta.internal.convert.ECBAbstractRateProvider newDataLoaded 
INFO: Loaded ECBHistoric90RateProvider exchange rates for days:63 
ExchangeRate [base=EUR, factor=1.0861, conversionContext=ConversionContext (
{provider=ECB, rateTypes=[DEFERRED], providerDescription=European Central Bank, days=1, org.javamoney.moneta.internal.convert.LocalDate=LocalDate{year=2016, month=1, dayOfMonth=8}, javax.money.convert.RateType=HISTORIC})] 
ExchangeRate [base=EUR, factor=1.0861, conversionContext=ConversionContext (
{provider=ECB, rateTypes=[DEFERRED], providerDescription=European Central Bank, days=1, org.javamoney.moneta.internal.convert.LocalDate=LocalDate{year=2016, month=1, dayOfMonth=8}, javax.money.convert.RateType=HISTORIC})] 
ExchangeRate [base=USD, factor=0.9207255317189946, conversionContext=ConversionContext (
{provider=ECB, rateTypes=[DEFERRED], providerDescription=European Central Bank, days=1, org.javamoney.moneta.internal.convert.LocalDate=LocalDate{year=2016, month=1, dayOfMonth=8}, javax.money.convert.RateType=HISTORIC})] 
sep. 11, 2017 9:58:35 AM org.javamoney.moneta.internal.convert.ECBAbstractRateProvider newDataLoaded 
INFO: Loaded ECBHistoricRateProvider exchange rates for days:4358 

Merci!

+0

Quelle classe 'LocalDate' importez-vous? –

+0

'LocaleDate' semble être celui de JDK8. Pourquoi utilisez-vous la bibliothèque backport ('-bp') qui est explicitement compilée avec JDK7? – vl4d1m1r4

+0

J'utilise java.time.LocalDate comme importation. Parce que si j'utilise la dépendance sur l'argent-api sans bp, je reçois null en conséquence. Et une mauvaise importation n'explique pas pourquoi je reçois un peu de vieux jours dans le deuxième exemple. Et si je change pour: .set (org.javamoney.moneta.internal.convert.LocalDate.class, org.javamoney.moneta.internal.convert.LocalDate.from (Calendar.getInstance())) je reçois le même problème. – Kiki

Répondre

1

Cette API est actuellement obscure. Si vous obtenez:

ConversionQueryBuilder.of().setTermCurrency("EUR"). 
     set(LocalDate.class, LocalDate.of(2018, 1, 1)).build() 
MonetaryConversions.getConversion(conversionQuery) 

Il utilisera la méthode suivante:

default CurrencyConversion getConversion(ConversionQuery conversionQuery) { 
    return getExchangeRateProvider(conversionQuery).getCurrencyConversion(
      Objects.requireNonNull(conversionQuery.getCurrency(), "Terminating Currency is required.") 
    ); 
} 

Comme vous pouvez le voir, le conversionQuery est utilisé pour obtenir le fournisseur, pas l'objet de conversion lui-même. Il est toujours renvoyé pour la requête avec uniquement la devise définie, jamais avec la date.

Pour faire utiliser de travail:

MonetaryConversions.getExchangeRateProvider().getCurrencyConversion(conversionQuery) 

Je crois qu'il devrait travailler de manière cohérente pour toutes les invocations.