2009-12-08 8 views
2

Je crée un service web en Java qui sera consommé par une application externe, probablement écrite en C#. Dans mon bean d'achat, j'ai un objet de devise pour le coût total. Cependant, cela conduit à l'erreur suivante:Quel type Java utiliser pour représenter une valeur monétaire dans un service Web?

Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions 
java.util.Currency does not have a no-arg default constructor. 

J'ai trouvé a solution pour créer un adaptateur XML personnalisé pour gérer le rassemblement des devises/unmarshalling:

public class CurrencyAdapter extends XmlAdapter<String,Currency> { 
    public Currency unmarshal(String val) throws Exception { 
    return Currency.getInstance(val); 
    } 
    public String marshal(Currency val) throws Exception { 
    return val.toString(); 
    } 
} 

pourrais-je utiliser cet adaptateur XML personnalisé, ou l'utilisation un objet BigDecimal (ou autre type) pour représenter le coût?

+1

'XmlAdapter' est l'approche correcte, c'est ce qu'il est là pour. – skaffman

+0

Devrais-je le marshal en tant que chaîne comme dans l'exemple ci-dessus? –

+0

Que se passe-t-il lorsque vous * essayez *? –

Répondre

4

Vous fusionnez une devise (qui est une unité nommée) et un coût (qui est une quantité dans cette unité). Vous ne pouvez pas représenter une devise en tant que BigInteger, car une devise n'est pas une quantité.

+0

Je n'ai pas compris ce que vous vouliez dire jusqu'à ce que j'obtienne une exception d'argument illégal en essayant de mettre la devise à une valeur numérique. C'est seulement alors que j'ai regardé le javadoc et compris ce que tu voulais dire. Quoi qu'il en soit, la question demeure - quel type de données dois-je utiliser pour transmettre une quantité de coût réel dans un service Web? –

+0

Vous devez utiliser n'importe quel type de données qui représente, sous la forme d'un entier, le numéro de la plus petite unité monétaire. Par exemple, en dollars, votre quantité serait le nombre de * cents *, bien que certaines transactions requerent des dixièmes de cents, auquel cas votre nombre (encore un entier) représenterait le nombre de dixièmes de cent. Tant que vous n'utilisez pas de virgule flottante, tout ira bien. Ensuite, il suffit de choisir un type de données suffisamment grand pour gérer la taille maximale de la transaction sans débordement. –