Как преобразовать BigDecimal в Double в структуре spring-data-mongodb

Отображение Spring Data MongoDB по умолчанию преобразует BigDecimal в String. Однако я хочу, чтобы они были преобразованы как Double в mongodb. Это необходимо для того, чтобы последний мог делать запросы к этому полю в mongodb (запросы сравнения/запросы агрегации). Как я могу зарегистрировать свой собственный конвертер (BigDecimalToDouble/DoubleToBigDecimal) для этого?


person Poorna Subhash    schedule 29.04.2014    source источник


Ответы (1)


Вот как вы можете добавить свои собственные преобразователи:

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg ref="mongoDbFactory"/>
    <constructor-arg ref="mappingConverter"/>
    <property name="writeConcern">
        <util:constant static-field="com.mongodb.WriteConcern.FSYNC_SAFE"/>
    </property>
    <property name="writeResultChecking">
        <util:constant static-field="org.springframework.data.mongodb.core.WriteResultChecking.EXCEPTION"/>
    </property>
</bean>

<mongo:mapping-converter id="mappingConverter">
    <mongo:custom-converters base-package="com.vladmihalcea.**.mongo.converter"/>
</mongo:mapping-converter>

Теперь ваши преобразователи будут выглядеть так:

@Component
public class DoubleToBigDecimalConverter implements Converter<Double, BigDecimal> {

    @Override
    public BigDecimal convert(Double source) {
        return new BigDecimal(source);
    }
}

@Component
public class BigDecimalToDoubleConverter implements Converter<BigDecimal, Double> {

    @Override
    public Double convert(BigDecimal source) {
        return source.doubleValue();
    }
}

Перед добавлением конвертера я получил:

update test.product query: { _id: 123 } update: { _id: 123, _class: "com.vladmihalcea.mongo.model.Product", name: "Tv", quantity: "10", discount: "12.34", version: 0 } nscanned:0 nupdated:1 upsert:1 keyUpdates:0 locks(micros) w:49328 50ms

После добавления преобразователей:

update test.product query: { _id: 123 } update: { _id: 123, _class: "com.vladmihalcea.mongo.model.Product", name: "Tv", quantity: "10", discount: 12.34, version: 0 } nscanned:0 nupdated:1 upsert:1 keyUpdates:0 locks(micros) w:64689 65ms
person Vlad Mihalcea    schedule 22.05.2014
comment
Конвертер @Viad BigDecimalToString уже доступен в фреймворке. Мне нужен конвертер BigDecimalToDouble. Даже если я зарегистрирую это, код фреймворка таков, что он всегда будет выбирать преобразователь BigDecimalToString, поскольку преобразователи по умолчанию идут перед пользовательскими преобразователями при поиске. - person Poorna Subhash; 22.05.2014
comment
@Poorna Я изменил свой ответ в соответствии с вашим предложением. Я думаю, что хорошо иметь как BigDecimalToDouble, так и BigDecimalToString, поскольку Spring принимает как sourceType, так и targetType при поиске соответствующего преобразователя. Поэтому, если ваше сопоставление Java имеет поле BigDecimal, а поле документа Mongo имеет тип double, тогда следует выбрать BigDecimalToDoubleConverter. Если все ваши документы Mongo сохранили поле в виде строки, вы не сможете воспользоваться этим конвертером. - person Vlad Mihalcea; 22.05.2014
comment
Хаб ты это пробовал? что, если я вставляю в первый раз. Откуда он знает? Посмотрите на класс CustomConversions. BigDecimal зарегистрирован как простой тип. Следовательно, не будет учитываться наше пользовательское преобразование - person Poorna Subhash; 22.05.2014
comment
Я попробую в своем репозитории GitHub и вернусь к вам. Последнее средство — конвертер DbObject. - person Vlad Mihalcea; 22.05.2014
comment
Я проверил себя, и это работает как шарм. Разветвите мой репозиторий GitHub и запустите этого теста. - person Vlad Mihalcea; 23.05.2014
comment
Это сработало. Я просто сделал какую-то ошибку ранее. Принятие в качестве ответа. - person Poorna Subhash; 23.05.2014