2016-07-15 1 views
1

Pojo를 XML로 변환하려면 Rest API 호출을 사용하고 있습니다. 다음은 Java 9 javax.money.MonetaryAmount (JSR 354) : Pojo를 XML로 또는 그 반대로 변환 할 수 없습니다.

내 코드입니다 :

TestAccount.java

import javax.money.MonetaryAmount; 

    public class TestAccount { 


     private MonetaryAmount paymentAmount; 

private String accountNumber; 


    public String getAccountNumber() { 
     return this.accountNumber; 
    } 


    public void setAccountNumber(String accountNumber) { 
     this.accountNumber = accountNumber; 
    } 
     public MonetaryAmount getPaymentAmount() { 
      return this.paymentAmount; 
     } 


     public void setPaymentAmount(MonetaryAmount paymentAmount) { 
      this.paymentAmount = paymentAmount; 
     } 

     } 

Controller.java

public class Controller extends BaseController { 

    @RequestMapping(value = "/javaTest", method = RequestMethod.GET, produces = { "application/xml" }) 
    public TestAccount testMoneyPackage() { 
     TestAccount obj = new TestAccount(); 
     obj.setAccountNumber("101423"); 
     obj.setPaymentAmount(MoneyUtilityCls.of(10.898)); 
     return obj; 
    } 
} 

브라우저에 URL을 실행

http://localhost:8080/api/javaTest

출력 :

<OverdueAccount> 
<accountNumber>101423</accountNumber> 
<paymentAmount> 
<currency> 
<context> 
<providerName>java.util.Currency</providerName> 
<empty>false</empty> 
</context> 
<defaultFractionDigits>2</defaultFractionDigits> 
<currencyCode>USD</currencyCode> 
<numericCode>840</numericCode> 
</currency> 
<number>10.9</number>*****loss of precision******* 
<negative>false</negative> 
<zero>false</zero> 
<precision>3</precision> 
<scale>1</scale> 
<positiveOrZero>true</positiveOrZero> 
<positive>true</positive> 
<negativeOrZero>false</negativeOrZero> 
<factory> 
<defaultMonetaryContext> 
<precision>0</precision> 
<amountType>org.javamoney.moneta.RoundedMoney</amountType> 
<fixedScale>false</fixedScale> 
<maxScale>-1</maxScale> 
<providerName/> 
<empty>false</empty> 
</defaultMonetaryContext> 
<amountType>org.javamoney.moneta.RoundedMoney</amountType> 
<maxNumber/> 
<minNumber/> 
<maximalMonetaryContext> 
<precision>0</precision> 
<amountType>org.javamoney.moneta.RoundedMoney</amountType> 
<fixedScale>false</fixedScale> 
<maxScale>-1</maxScale> 
<providerName/> 
<empty>false</empty> 
</maximalMonetaryContext> 
</factory> 
<context> 
<precision>0</precision> 
<amountType>org.javamoney.moneta.RoundedMoney</amountType> 
<fixedScale>false</fixedScale> 
<maxScale>-1</maxScale> 
<providerName/> 
<empty>false</empty> 
</context> 
</paymentAmount> 
</OverdueAccount> 

od.setPaymentAmount (MoneyUtil.of (10.898))를 설정하면 당신이 볼 수 있듯이,

내가 그 여분의 XML 태그가 무엇인지

또한

<number>10.9</number>

으로 XML 정밀도의 손실을 얻고있다?

이 문제는 MonetaryAmount 필드에서만 발생하며 그렇지 않으면 코드가 제대로 실행 중입니다. 그래서 MonetaryAmount 필드를 Pojo로 XML로 변환하는 정확한 방법은 정확하지 않고 그 반대의 경우도 마찬가지입니다.

답변

2

MoneyUtil/MoneyUtilityCls 클래스의 코드를 공유 할 수 있습니까?

사용 된 MonetaryAmount의 구현이 기본 분수 1의 RoundedMoney 인 것으로 추측됩니다. 이는 설명 된 동작으로 이어질 것입니다.

이 경우의 해결책은 유틸리티가 다른 클래스 (예 : Money)를 반환하거나 반환 된 RoundedMoney 객체의 소수 자릿수를 변경하는 것입니다.

+0

"이 경우의 솔루션은 유틸리티에서 다른 클래스 (예 : Money)를 반환하거나 반환 된 RoundedMoney 객체의 소수 자릿수를 변경하는 것입니다." 그것은 효과가 있었다. 고맙습니다. – AftabLib

2

"돈을 이중 또는 부동으로 표시하는 것은 소프트웨어가 작은 오류를 마무리 짓는 것처럼 보일 것입니다. 그러나 부정확 한 숫자에 더 많은 추가, 빼기, 곱셈 및 나누기를 수행하면 더 많은 것을 잃게됩니다 정밀도가 높아짐에 따라 부동 소수점과 복식이 불충분 해지며, 기본 10 배수의 배수에 대한 완벽한 정확성이 요구됩니다. "

마지막으로 Java에는 통화 및 금액을 사용하는 표준 방법이 있습니다! JSR 354

: 돈과 환율 API

JSR 354은 돈과 통화를 종합 계산을 나타내는 수송 및 수행하기위한 API를 제공한다.당신은이 링크에서 다운로드 할 수 있습니다 :

JSR 354: Money and Currency API Download

사양은 다음과 같은 것들로 구성

  1. 전자를 처리하기위한 API를. 지. 통화 금액과 통화
  2. API는 구현 클래스의 화폐 금액의 계산, 변환 및 포맷에 대한
  3. 기능을 인스턴스를 생성하기위한 상호 교환 구현을
  4. 공장을 지원하는
  5. 이고 돈과 통화, 작업을위한
  6. 자바 API Java 9에 포함될 예정입니다.
  7. 모든 스펙 클래스와 인터페이스는 javax.money. * 패키지에 있습니다. JSR 354의

샘플 예 : 돈과 환율 API :

MONETARYAMOUNT가 작성하고 콘솔에 인쇄의 예는이 ::

MonetaryAmountFactory<?> amountFactory = Monetary.getDefaultAmountFactory(); 
MonetaryAmount monetaryAmount = amountFactory.setCurrency(Monetary.getCurrency("EUR")).setNumber(12345.67).create(); 
MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(Locale.getDefault()); 
System.out.println(format.format(monetaryAmount)); 

때처럼 보인다 참조 구현 API를 사용하면 필요한 코드가 훨씬 간단 해집니다.

MonetaryAmount monetaryAmount = Money.of(12345.67, "EUR"); 
MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(Locale.getDefault()); 
System.out.println(format.format(monetaryAmount)); 
,515,

또한 API MonetaryAmounts으로 계산 지원

MonetaryAmount monetaryAmount = Money.of(12345.67, "EUR"); 
MonetaryAmount otherMonetaryAmount = monetaryAmount.divide(2).add(Money.of(5, "EUR")); 

CurrencyUnit 및 MONETARYAMOUNT가

// getting CurrencyUnits by locale 
CurrencyUnit yen = MonetaryCurrencies.getCurrency(Locale.JAPAN); 
CurrencyUnit canadianDollar = MonetaryCurrencies.getCurrency(Locale.CANADA); 

MonetaryAmount을 다양한 할당 통화 숫자 양 액세스 허용 방법 정밀도 더 가지고

MonetaryAmount monetaryAmount = Money.of(123.45, euro); 
CurrencyUnit currency = monetaryAmount.getCurrency(); 
NumberValue numberValue = monetaryAmount.getNumber(); 

int intValue = numberValue.intValue(); // 123 
double doubleValue = numberValue.doubleValue(); // 123.45 
long fractionDenominator = numberValue.getAmountFractionDenominator(); // 100 
long fractionNumerator = numberValue.getAmountFractionNumerator(); // 45 
int precision = numberValue.getPrecision(); // 5 

// NumberValue extends java.lang.Number. 
// So we assign numberValue to a variable of type Number 
Number number = numberValue; 

반올림 연산자를 사용하여 MonetaryAmounts를 반올림 할 수 있습니다.

CurrencyUnit usd = MonetaryCurrencies.getCurrency("USD"); 
MonetaryAmount dollars = Money.of(12.34567, usd); 
MonetaryOperator roundingOperator = MonetaryRoundings.getRounding(usd); 
MonetaryAmount roundedDollars = dollars.with(roundingOperator); // USD 12.35 

MonetaryAmounts 컬렉션으로 작업 할 때 필터링, 정렬 및 그룹화를위한 유용한 유틸리티 메소드를 사용할 수 있습니다.

List<MonetaryAmount> amounts = new ArrayList<>(); 
amounts.add(Money.of(2, "EUR")); 
amounts.add(Money.of(42, "USD")); 
amounts.add(Money.of(7, "USD")); 
amounts.add(Money.of(13.37, "JPY")); 
amounts.add(Money.of(18, "USD")); 

사용자 정의 MonetaryAmount을 운영

// A monetary operator that returns 10% of the input MonetaryAmount 
// Implemented using Java 8 Lambdas 
MonetaryOperator tenPercentOperator = (MonetaryAmount amount) -> { 
    BigDecimal baseAmount = amount.getNumber().numberValue(BigDecimal.class); 
    BigDecimal tenPercent = baseAmount.multiply(new BigDecimal("0.1")); 
    return Money.of(tenPercent, amount.getCurrency()); 
}; 

MonetaryAmount dollars = Money.of(12.34567, "USD"); 

// apply tenPercentOperator to MonetaryAmount 
MonetaryAmount tenPercentDollars = dollars.with(tenPercentOperator); // USD 1.234567 

자료 :

Handling money and currencies in Java with JSR 354

또한

Looking into the Java 9 Money and Currency API (JSR 354)

참조 : JSR 354 - Currency and Money

관련 문제