usar quitar numero notacion convertir como cientifica java xsd jaxb xjc cxf-xjc-plugin

numero - quitar notacion cientifica java



JAXB clasifica para BigDecimal usando fractionDigits (3)

Si puede cambiar el XSD para usar el tipo precisionDecimal documentado aquí, es posible que pueda usar las facetas minScale y maxScale configuradas con el mismo valor.

Así que aquí está mi problema. Me dieron un XSD al que mi archivo XML generado debería cumplir. Usando el org.apache.cxf.cxf-xjc-plugin maven org.apache.cxf.cxf-xjc-plugin y un archivo de enlace externo genero el código fuente. Pero cuando intento solucionar mi problema, el XML generado no cumple mis requisitos.

Mi XSD contiene lo siguiente:

<xsd:element maxOccurs="1" minOccurs="0" name="amount"> <xsd:simpleType> <xsd:restriction base="xsd:decimal"> <xsd:totalDigits value="13" /> <xsd:fractionDigits value="2" /> </xsd:restriction> </xsd:simpleType> </xsd:element> ... <xsd:element maxOccurs="1" minOccurs="0" name="rate"> <xsd:simpleType> <xsd:restriction base="xsd:decimal"> <xsd:totalDigits value="8" /> <xsd:fractionDigits value="5" /> </xsd:restriction> </xsd:simpleType> </xsd:element>

Y la pieza generada de XML se ve así:

<amount>109.5</amount> ... <rate>10.25</rate>

Mientras esperaba que fuera:

<amount>109.50</amount> ... <rate>10.25000</rate>

¿Hay alguna manera de resolver este problema de una manera limpia?

Preferiría no escribir varios adaptadores para cada combinación de totalDigits , fractionDigits . Y como el XSD está sujeto a cambios, me gustaría dejar intacto el código fuente generado.


Tendrá que usar XmlAdapter para este caso de uso. A continuación se muestra un archivo de enlace de muestra que lo ayudará a generarlos. La lógica estaría contenida en una clase DecimalFormatter que contenía métodos para todos los diferentes formatos requeridos.

<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> <jxb:bindings schemaLocation="schema.xsd"> <jxb:bindings node="//xs:element[@name=''amount'']"> <jxb:property> <jxb:baseType> <jxb:javaType name="java.math.BigDecimal" parseMethod="org.example.DecimalFormatter.parseDecimal" printMethod="org.example.DecimalFormatter.printDecimal_2Places" /> </jxb:baseType> </jxb:property> </jxb:bindings> <jxb:bindings node="//xs:element[@name=''rate'']"> <jxb:property> <jxb:baseType> <jxb:javaType name="java.math.BigDecimal" parseMethod="org.example.DecimalFormatter.parseDecimal" printMethod="org.example.DecimalFormatter.printDecimal_5Places" /> </jxb:baseType> </jxb:property> </jxb:bindings> </jxb:bindings> </jxb:bindings>

Para más información


Estoy confundido en cuanto a lo que se podría ganar manteniendo los ceros al final.

Si los ceros finales son importantes de preservar, utilice un valor de cadena en lugar de un número y use atributos para especificar su ancho y decimales.

En cualquier caso, los ceros finales nunca afectarán los cálculos usando ninguno de estos valores, y la única forma en que podría presentarlos es convirtiendo los resultados en una cadena y rellenándolos usted mismo. Para obtener ayuda haciendo eso, es posible que desee ver ...

Formato de mensaje SOAP cliente CXF