无论如何将构造函数参数传递给JAXB适配器?

我在我写的WebService中使用Spring 3 IOC和JAXB / JAX-WS。 我现在有一个小问题,数据必须在返回消费者之前进行舍入,因为它们无法处理值的完整精度。

为了最小化对WS设计和计算的影响,我选择使用Jaxb XmlAdapter在编组响应时对值进行舍入。 一切正常。

我现在的问题是我想让它变得灵活。 即:在某些情况下,我需要舍入到2个小数位,大约4个等等。现在,我必须创建一个TwoDecimalAdapter和一个FourDecimalAdapter,并在模型定义中使用必要的相应位置。 这意味着代码重复。

反正有没有创建一个通用的Rounding Adapter,并传递一个参数给它? 例如,而不是:

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

我希望能够做到这样的事情:

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

显然,这不起作用,因为JAXB实例化适配器本身,但是有什么技术可以用来将参数传递给适配器吗? 我希望能够在Spring中声明舍入适配器并以这种方式使用它,但又一次,我无法设计一个可重用的解决方案。

谢谢,

埃里克

我不确定你是如何用Spring挂钩的,但下面是你可以利用的JAXB机制的描述。

如果您有以下内容:

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

然后使用独立的JAXB API,您可以执行以下操作。 下面的代码表示遇到RoundingAdapter时,应使用指定的实例。

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

了解更多信息