How to configure custom Mongo formatters in Spring?

I have been doing this for several hours and have not found anyone who would get this job. I want to save a BigDecimal object in Mongo, but Mongo does not support BigDecimal. I followed Spring docs here , but no luck.

From what I can tell, Spring doesn't introduce my custom converter classes in Mongo when it is written in db. Here is what I did:

My application context-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> 

The error I am getting is:

 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) 
+6
source share
2 answers

This is how I solved it. The order in which you define beans matters. So my app.xml I worked with is:



  <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"/> 

code>
0
source

Try using this to support the converter:

 <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> 
0
source

Source: https://habr.com/ru/post/895494/


All Articles