CurrencyUnit of javamoney не может быть использован как класс поля и десериализован Джексоном из-за InvalidDefinitionException - PullRequest
1 голос
/ 05 ноября 2019

У меня есть pojo с полем типа CurrencyUnit из библиотеки javamoney. Когда я делаю маршал, это pojo Джексон выбрасывает исключение. Я помню это исключение, когда я не определял конструктор по умолчанию. Но в этом случае я не могу поддерживать класс CurrencyUnit, так как он исходит из зависимости. Как я могу все еще заставить эту работу?

Исключение:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `javax.money.CurrencyUnit` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information\n at 

1 Ответ

1 голос
/ 05 ноября 2019

Вы должны написать собственный сериализатор / десериализатор для каждого типа из пакета javax.money, который вы хотите использовать, или зарегистрировать уже созданный модуль. Например: jackson-datatype-money .

Вам необходимо добавить зависимость :

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

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

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.zalando.jackson.datatype.money.MoneyModule;

import javax.money.CurrencyUnit;
import javax.money.Monetary;

public class JsonMoneyApp {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.registerModule(new MoneyModule());

        CurrencyUnit cu = Monetary.getCurrency("USD");
        String json = mapper.writeValueAsString(cu);
        System.out.println(json);

        CurrencyUnit unit = mapper.readValue(json, CurrencyUnit.class);
        System.out.println(unit);
    }
}

Код напечатан выше:

"USD"
USD
...