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

Eri*_* B. 10 java spring jaxb adapter

我在我写的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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢,

埃里克

bdo*_*han 2

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

如果您有以下情况:

@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=RoundingAdapter.class,type=java.math.BigDecimal.class)
Run Code Online (Sandbox Code Playgroud)

然后使用独立的 JAXB API,您可以执行以下操作。下面的代码意味着每当RoundingAdapter遇到 时,都应该使用指定的实例。

marshaller.setAdapter(new RoundingAdapter(4));
unmarshaller.setAdapter(new RoundingAdapter(4));
Run Code Online (Sandbox Code Playgroud)

了解更多信息

  • 在我自己控制编组/解组的情况下,这似乎相当简单。但在 JAX-WS 的上下文中,它神奇地为我完成所有工作,而无需我自己处理,我如何向它表明我想要使用 new RoundingAdapter(4)?我从来没有用 JAX-WS 实例化任何编组器/解组器...... (2认同)