如何在Spring中修复JSON解码错误?

时间:2019-01-15 14:52:09

标签: java spring jackson spring-webflux

我正在通过REST发送一个User对象,该对象包含一组SimpleGrantedAuthority对象。在接收方,我遇到了异常:

  

org.springframework.core.codec.DecodingException:JSON解码错误:   无法构造的实例   org.springframework.security.core.authority.SimpleGrantedAuthority   (尽管至少存在一个创建者):无法从Object反序列化   价值(没有基于委托人或财产的创造者);

我正在使用Spring Boot 2.1.2提供的默认JSON映射器。在接收端,我正在使用WebFlux的WebClient(在这种情况下为WebTestClient)。

有人可以向我解释为什么我会收到此错误以及如何解决该错误吗?

1 个答案:

答案 0 :(得分:3)

SimpleGrantedAuthority不适合使用Jackson进行自动映射;它没有用于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());
    }
}

像这样在全球范围内向Jackson进行注册:

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

或通过以下方式注释字段:

@JsonDeserialize(using = SimpleGrantedAuthorityDeserializer.class)

注意:您不需要序列化器,因为SimpleGrantedAuthority具有getAuthority()方法,杰克逊可以使用。