2011-08-20 13 views
6

He estado en esto por unas horas y aún no he encontrado a nadie que lo haya hecho funcionar. Quiero persistir un objeto BigDecimal en Mongo, pero Mongo no es compatible nativamente con BigDecimal. Seguí los documentos de Spring here pero no tuve suerte.¿Cómo configuro los formateadores de Mongo personalizados en Spring?

Según lo que puedo decir, Spring no está inyectando mis clases de convertidor personalizadas en Mongo cuando está escribiendo en el db. Esto es lo que he hecho:

Mi applicationContext-services.xml ...

<!-- Factory bean that creates the Mongo instance --> 
    <mongo:mongo 
     host="localhost" 
     port="1234" /> 

    <mongo:db-factory 
     dbname="solar" 
     mongo-ref="mongo"/> 

    <mongo:mapping-converter> 
     <mongo:custom-converters> 
     <mongo:converter> 
      <bean class="com.mine.BigDecimalReadConverter"/> 
     </mongo:converter> 
     <mongo:converter> 
      <bean class="com.mine..BigDecimalWriteConverter"/> 
     </mongo:converter> 
     </mongo:custom-converters> 
    </mongo:mapping-converter> 

    <!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes --> 

    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

<bean id="mongoDbTest" 
    class="com.mine.MongoDbTest"> 
    <property name="mongoTemplate"> 
     <ref local="mongoTemplate" /> 
    </property> 
</bean> 

El error que estoy recibiendo es:

java.lang.IllegalArgumentException: Multiple constructors with arguments found in class java.math.BigDecimal! Annotate one with @PreferedConstructor explicitly to select it to be used in persistence operations. 
    at org.springframework.data.mapping.PreferredConstructorDiscoverer.<init>(PreferredConstructorDiscoverer.java:81) 
+0

Miras a las pruebas de unidad en primavera-datos o el módulo que u está utilizando? – chrislovecnm

+0

no tengo. Lo configuré como lo sugieren los documentos, pero no tuve suerte. – emilebaizel

+0

qué versión de los datos de Spring está utilizando ?? –

Respuesta

0

Así es como he resuelto esto. El orden en que defines los frijoles es importante. Así que mi app.xml que tengo que trabajar con es:

<bean id="mappingContext" class="org.springframework.data.document.mongodb.mapping.MongoMappingContext"/> 

<bean id="readConverter" class="com.mine.BigDecimalReadConverter"/> 
<bean id="writeConverter" class="com.mine.BigDecimalWriteConverter"/> 

<mongo:mapping-converter id="mappingConverter"> 
    <mongo:custom-converters> 
     <mongo:converter ref="readConverter" /> 
     <mongo:converter ref="writeConverter" /> 
    </mongo:custom-converters> 
</mongo:mapping-converter> 

<!-- Factory bean that creates the Mongo instance --> 
<mongo:mongo 
    host="${${environment}.mongodb.host}" 
    port="${${environment}.mongodb.port}" /> 

<mongo:db-factory 
    dbname="${${environment}.mongodb.databaseName}" 
    mongo-ref="mongo"/> 

<bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemplate"> 
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> 
    <constructor-arg name="mongoConverter" ref="mappingConverter"/> 
</bean> 

<!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes --> 
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

0

Trate de usar este para soporte del convertidor:

<bean id="mappingContext" 
    class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" lazy-init="true"/> 

<bean id="defaultMongoTypeMapper" 
    class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper" lazy-init="true"> 
    <constructor-arg name="typeKey"><null/></constructor-arg> 
</bean> 

<bean id="mappingMongoConverter" 
    class="org.springframework.data.mongodb.core.convert.MappingMongoConverter" lazy-init="true" > 
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> 
    <constructor-arg name="mappingContext" ref="mappingContext" /> 
    <property name="typeMapper" ref="defaultMongoTypeMapper" /> 
</bean> 

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate" lazy-init="true"> 
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> 
    <constructor-arg name="mongoConverter" ref="mappingMongoConverter" /> 
</bean> 
Cuestiones relacionadas