Moneta, Spring Data Mongo, and Jackson

Mike Key
sipsak
Published in
2 min readSep 11, 2019
Photo by Fabian Blank on Unsplash

Making all the things work together sometimes seems like more effort than its worth. This won’t help you with that, but if you need to get JSR354 working with Spring Boot and Spring Data MongoDB this may help you some.

The following steps assume you already have a Spring Boot app configured with Spring Data MongoDB and understand the basics of these technologies. These steps work for me with these already on classpath to start:

* Spring Boot 2.1.7
* Spring Data MongoDB 2.1.10
* Moneta 1.3

Jackson Money Support

To make Jackson aware of how to deal with Money add the [jackson-datatype-money] library to your classpath:

<dependency>
<groupId>org.zalando</groupId>
<artifactId>jackson-datatype-money</artifactId>
<version>1.1.1</version>
</dependency>

Then create a new configuration class to enable the module:


import com.fasterxml.jackson.databind.Module;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.zalando.jackson.datatype.money.MoneyModule;
@Configuration
public class JacksonConfiguration {
@Bean
public Module moneyModule() {
return new MoneyModule().withMoney();
}
}

Boom you are now a Money serializing fool.

Spring Data Mongo Money Support

Now to make Spring Data MongoDB understand how to convert a `Money` into a simple string to be stored in the database.

First create a read and write `Converter`. In this case to and from a string.

Read Converter

import org.javamoney.moneta.Money;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
@ReadingConverter
public class MoneyReadConverter implements Converter<String, Money> {
@Override
public Money convert(String moneyString) {
return Money.parse(moneyString);
}
}

Write Converter

import org.javamoney.moneta.Money;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.WritingConverter;
@WritingConverter
public class MoneyWriteConverter implements Converter<Money, String> {
@Override
public String convert(Money money) {
return money.toString();
}
}

Next override the Spring Data Mongo MongoCustomConversions in a configuration which includes your shiny new converters.

@Configuration
public class MongoConfiguration {
@Bean
public MongoCustomConversions mongoCustomConversions() {
List<Converter> converters = new ArrayList<>();
converters.add(new MoneyReadConverter());
converters.add(new MoneyWriteConverter());
return new MongoCustomConversions(converters);
}
}

Now simply build, run and revel in your greatness.

--

--