2013-02-13 33 views
5

Vì vậy, đây là vấn đề của tôi. Tôi được cung cấp một XSD mà tệp XML được tạo của tôi sẽ tuân thủ. Sử dụng plugin org.apache.cxf.cxf-xjc-plugin maven và tệp ràng buộc bên ngoài tôi tạo mã nguồn. Nhưng khi tôi đang thử marshall đối tượng của tôi, XML được tạo ra không đáp ứng các yêu cầu của tôi.JAXB marshalling cho BigDecimal sử dụng fractionDigits

XSD My chứa sau:

<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> 

Và mảnh tạo của XML trông như thế này:

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

Trong khi tôi đang mong nó sẽ được:

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

Có cách nào để giải quyết vấn đề này một cách sạch sẽ không?

Tôi không thích viết nhiều bộ điều hợp cho mỗi kết hợp totalDigits, fractionDigits. Và như XSD có thể thay đổi tôi muốn để lại mã nguồn được tạo ra không bị ảnh hưởng.

+3

Tài liệu w3c trên datatype thập phân nói 'fractionDigits' xác định giới hạn trên về số chữ số sau dấu phân cách thập phân. Nó không quan trọng đối với bất cứ điều gì đọc dữ liệu nếu các số 0 bên phải không có. Trường hợp sử dụng yêu cầu padding bằng không là gì? –

+0

@Jim Phân tích ứng dụng (kế thừa) của tệp XML được tạo của tôi yêu cầu không có đệm ;-) – Jasper

+0

Bạn có thể sử dụng 'precisionDecimal' như trong câu trả lời của tôi không? –

Trả lời

5

Bạn sẽ cần sử dụng XmlAdapter cho trường hợp sử dụng này. Dưới đây là một tệp ràng buộc mẫu sẽ giúp bạn tạo chúng. Logic sẽ được chứa trong một lớp DecimalFormatter chứa các phương thức cho tất cả các định dạng yêu cầu khác nhau.

<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> 

Để biết thêm thông tin

+0

Tôi đang thực sự làm điều này ngay bây giờ, nhưng tôi đang cố gắng tìm một giải pháp * clean * vì điều này đòi hỏi tôi phải tạo một 'printMethod' cho mỗi' totalDigits' - 'fractionDigits' kết hợp. – Jasper

0

Nếu bạn có thể thay đổi XSD để sử dụng các loại tài liệu precisionDecimalhere bạn có thể sử dụng minScalemaxScale khía cạnh thiết lập để cùng giá trị.

+0

Theo [câu trả lời này] (http://stackoverflow.com/a/4901771/321366), đặc tả JAXB không bao gồm việc chuyển đổi Lược đồ XML 1.1 sang Java.Và XJC ném ngoại lệ sau đây [ERROR] src-resolve: Không thể giải quyết tên 'xsd: precisionDecimal' thành thành phần (n) 'định nghĩa kiểu' khi tôi thử. – Jasper

0

Tôi đang bối rối như những gì có thể có thể đạt được bằng cách duy trì số không đuôi.

Nếu các số 0 ở cuối quan trọng để bảo toàn, hãy sử dụng giá trị chuỗi thay vì một số và sử dụng các thuộc tính để xác định chiều rộng và số thập phân của nó.

Trong mọi trường hợp, các số 0 sẽ không bao giờ ảnh hưởng đến các phép tính bằng cách sử dụng bất kỳ giá trị nào và cách duy nhất bạn có thể trình bày chúng là chuyển đổi kết quả thành chuỗi và tự đệm. Đối với một số trợ giúp thực hiện điều đó, bạn có thể muốn xem ...

CXF client SOAP message formatting