2013-11-21 4 views
6

У меня странная проблема с нашим веб-сервисом. У меня есть объект OrderPosition, у которого есть цена (которая равна xsd: decimal с fractionDigits = 9). Apache CXF генерирует классы прокси для меня, и это поле BigDecimal. Когда я хочу отправить значение больше 10000000.00000, это поле в мыльном сообщении имеет научную нотацию (например, 1.1423E + 7).BigDecimal имеет научную нотацию в мыльном сообщении

Как я могу обеспечить, чтобы значение не было отправлено в научной нотации.

+0

Какая привязка (например, jaxb и т. Д.) Вы используете? – Santosh

+0

Я использую jaxb для привязки xml. И это поле имеет аннотацию: @XmlElement (name = "NetPrice", required = true) protected BigDecimal netPrice; –

ответ

3

Вот один из способов, которым это можно сделать.

BigDecimal имеет конструктор, который вводит номер ввода в виде строки. Это при использовании сохраняет форматирование ввода при вызове метода .toString(). например

BigDecimal bd = new BigDecimal("10000000.00000"); 
System.out.println(bd); 

10000000.00000 напечатает.

Это может быть использовано в Jaxb XmlAdapters. Jaxb XmlAdapters предлагают удобный способ: контролировать/настраивать процесс сортировки/удаления файлов. Типичный адаптер для BigDecimmal будет выглядеть следующим образом.

public class BigDecimalXmlAdapter extends XmlAdapter{ 

    @Override 
    public String marshal(BigDecimal bigDecimal) throws Exception { 
     if (bigDecimal != null){ 
      return bigDecimal.toString(); 
     } 
     else { 
      return null; 
     } 
    } 

    @Override 
    public BigDecimal unmarshal(String s) throws Exception { 
     try { 
      return new BigDecimal(s); 
     } catch (NumberFormatException e) { 
      return null; 
     } 
    } 
} 

Это необходимо зарегистрировать в контексте Jaxb. Here is the link с полным примером.

0

@ Сантош Спасибо! XMLAdapter был тем, что мне нужно. Кроме того, как я сказал в своем вопросе, я генерирую клиентские классы с Apache CXF. В этой проблеме мне пришлось добавить следующий код в bindings.xjb (файл привязки, который используется для cxf-codegen-plugin в maven).

<jaxb:javaType name="java.math.BigDecimal" xmlType="xs:decimal" 
    parseMethod="sample.BigDecimalFormater.parseBigDecimal" 
    printMethod="sample.BigDecimalFormater.printBigDecimal" /> 

Это мой форматировщик код:

public class BigDecimalFormater { 
    public static String printBigDecimal(BigDecimal value) { 
     value.setScale(5); 

     return value.toPlainString(); 
    } 

    public static BigDecimal parseBigDecimal(String value) { 
     return new BigDecimal(value); 
    } 
} 

Затем этот плагин генерирует адаптер для меня

public class Adapter1 extends XmlAdapter<String, BigDecimal> { 
    public BigDecimal unmarshal(String value) { 
     return (sample.BigDecimalFormater.parseBigDecimal(value)); 
    } 
    public String marshal(BigDecimal value) { 
     return (sample.BigDecimalFormater.printBigDecimal(value)); 
    } 
} 

В созданном классе BigDecimal поле имеет аннотацию @XmlJavaTypeAdapter (Adapter1 .class), и это разрешило проблему.

+1

спасибо, что поделились этим подходом. – Santosh

Смежные вопросы