2012-07-12 23 views
7

Tôi đang sử dụng Spring 3 IOC và JAXB/JAX-WS trong một WebService mà tôi đã viết. Tôi đang gặp vấn đề nhỏ ngay bây giờ với dữ liệu phải được làm tròn trước khi quay trở lại người tiêu dùng vì họ không có khả năng xử lý độ chính xác hoàn toàn của các giá trị.Dù sao để truyền tham số khởi tạo tới Bộ tiếp hợp JAXB?

Để giảm thiểu tác động lên thiết kế và tính toán của WS, tôi đã chọn sử dụng Jaxb XmlAdapter để làm tròn các giá trị khi marshalling phản hồi của tôi. Mọi thứ đều hoạt động tốt.

Vấn đề của tôi bây giờ là tôi muốn làm cho nó linh hoạt. Tức là: trong một số trường hợp, tôi cần phải làm tròn đến 2 chữ số thập phân, trong một số 4, v..v .. Ngay bây giờ, tôi phải tạo một TwoDecimalAdapter và một FourDecimalAdapter và sử dụng một vị trí thích hợp khi cần thiết trong các định nghĩa mô hình của tôi. Điều này có nghĩa là sao chép mã.

Có cách nào để tạo Bộ điều hợp làm tròn chung và chuyển thông số cho nó? Ví dụ, thay vì:

@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=FourDecimalRoundingAdapter.class,type=java.math.BigDecimal.class) 

Tôi muốn để có thể làm điều gì đó như:

@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=new RoundingAdapter(4),type=java.math.BigDecimal.class) 

Rõ ràng điều đó không làm việc như JAXB instantiates adapter chính nó, nhưng là có kỹ thuật nào Tôi có thể sử dụng để chuyển các tham số cho bộ điều hợp? Tôi rất muốn có thể khai báo bộ điều hợp làm tròn trong Spring và sử dụng nó theo cách đó, nhưng một lần nữa, tôi không thể đưa ra một giải pháp có thể tái sử dụng được.

Cảm ơn,

Eric

Trả lời

2

Tôi không chắc chắn làm thế nào bạn treo này với mùa xuân, nhưng dưới đây là một mô tả về cơ chế JAXB mà bạn có thể tận dụng.

Nếu bạn có những điều sau đây:

@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=RoundingAdapter.class,type=java.math.BigDecimal.class) 

Sau đó, sử dụng các API JAXB độc lập bạn có thể làm những điều sau đây. Mã dưới đây có nghĩa là bất cứ khi nào gặp phải RoundingAdapter, thì cá thể được chỉ định sẽ được sử dụng.

marshaller.setAdapter(new RoundingAdapter(4)); 
unmarshaller.setAdapter(new RoundingAdapter(4)); 

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

+2

Đó dường như khá đơn giản trong bối cảnh nơi tôi sẽ được kiểm soát marshalling/unmarshalling bản thân mình. Nhưng trong bối cảnh của JAX-WS, nơi nó kỳ diệu thực hiện tất cả công việc cho tôi mà không phải tự mình xử lý, làm cách nào để chỉ ra rằng tôi muốn sử dụng RoundingAdapter (4) mới? Tôi không bao giờ khởi tạo bất kỳ marshallers/unmarshallers với JAX-WS .... –

Các vấn đề liên quan