Как исправить ошибку декодирования JSON в Spring? - PullRequest
0 голосов
/ 15 января 2019

Я отправляю объект User через REST, который содержит набор объектов SimpleGrantedAuthority. На стороне получателя я получаю исключение:

org.springframework.core.codec.DecodingException: ошибка декодирования JSON: Невозможно создать экземпляр org.springframework.security.core.authority.SimpleGrantedAuthority (хотя существует хотя бы один Создатель): не может десериализоваться из Объекта значение (без создателя на основе делегатов или свойств);

Я использую маппер JSON по умолчанию, который предоставляет Spring Boot 2.1.2. На принимающей стороне я использую WebClient WebFlux (в данном случае WebTestClient).

Может кто-нибудь объяснить мне, почему я получаю эту ошибку и как ее решить?

1 Ответ

0 голосов
/ 15 января 2019

SimpleGrantedAuthority не подходит для автоматического картирования с Джексоном; у него нет конструктора без аргументов и нет установщика для поля authority.

Так что для этого нужен специальный десериализатор . Примерно так:

class SimpleGrantedAuthorityDeserializer extends StdDeserializer<SimpleGrantedAuthority> {
    public SimpleGrantedAuthorityDeserializer() {
        super(SimpleGrantedAuthority.class);
    }
    @Override
    public SimpleGrantedAuthority deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonNode tree = p.getCodec().readTree(p);
        return new SimpleGrantedAuthority(tree.get("authority").textValue());
    }
}

Зарегистрируйте это с Джексоном по всему миру, как это:

objectMapper.registerModule(new SimpleModule().addDeserializer(
                      SimpleGrantedAuthority.class, new SimpleGrantedAuthorityDeserializer()));

Или пометьте поля (полей) с помощью:

@JsonDeserialize(using = SimpleGrantedAuthorityDeserializer.class)

Примечание: вам не нужен сериализатор , потому что SimpleGrantedAuthority имеет метод getAuthority(), который используется Джексоном.

...