2012-07-12 10 views
7

Estoy usando Spring 3 IOC y JAXB/JAX-WS en un WebService que escribí. En este momento estoy teniendo un pequeño problema con los datos que deben redondearse antes de devolverlos al consumidor, ya que no son capaces de manejar la precisión completa de los valores.¿De todos modos para pasar un parámetro constructor a un adaptador JAXB?

Para minimizar el impacto en el diseño y los cálculos de WS, elijo usar un Jaxb XmlAdapter para redondear los valores al ordenar mi respuesta. Todo funciona bien

Mi problema ahora es que me gustaría hacerlo flexible. Es decir: en algunos casos, necesito redondear a 2 lugares decimales, en 4, etc. En este momento, tengo que crear un adaptador doble y un adaptador cuádruple y usar el apropiado cuando sea necesario en las definiciones de mi modelo. Esto significa duplicación de código.

¿Hay alguna forma de crear un adaptador de redondeo genérico y pasarle un parámetro? Por ejemplo, en lugar de:

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

Me gustaría ser capaz de hacer algo como:

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

Obviamente eso no funciona como JAXB instancia el propio adaptador, pero ¿hay alguna técnica Puedo usar para pasar los parámetros al adaptador? Me encantaría poder declarar el adaptador de redondeo en Spring y usarlo de esa manera, pero una vez más, no puedo diseñar una solución reutilizable.

Gracias,

Eric

Respuesta

2

no estoy seguro de cómo conectar esto con la primavera, pero por debajo es una descripción del mecanismo de JAXB que puede aprovechar.

Si usted tiene lo siguiente:

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

Luego, utilizando las API JAXB independientes que podría hacer lo siguiente. El código siguiente significa que siempre que se encuentre el RoundingAdapter, se debe usar la instancia especificada.

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

Para más información

+2

Eso parece bastante sencillo en el contexto donde estaría el control de la maniobra/unmarshalling mí mismo. Pero en el contexto de JAX-WS donde mágicamente hace todo el trabajo por mí sin tener que lidiar conmigo mismo, ¿cómo le indico que quiero usar el nuevo RoundingAdapter (4)? Nunca instanciar ningún marshallers/unmarshallers con JAX-WS .... –

Cuestiones relacionadas