java - 如何修复 Spring 中的 JSON 解码错误?

标签 java spring jackson spring-webflux

我正在通过 REST 发送一个用户对象,其中包含一组 SimpleGrantedAuthority 对象。在接收端,我遇到了一个异常:

org.springframework.core.codec.DecodingException: JSON decoding error: Cannot construct instance of org.springframework.security.core.authority.SimpleGrantedAuthority (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator);

我正在使用 Spring Boot 2.1.2 提供的默认 JSON 映射器。在接收方,我使用的是 WebFlux 的 WebClient(在本例中为 WebTestClient)。

任何人都可以向我解释为什么会出现此错误以及如何解决它吗?

最佳答案

SimpleGrantedAuthority不适合与 Jackson 进行自动映射;它没有无参数构造函数,也没有 authority 字段的 setter。

所以它需要一个自定义的反序列化器。像这样:

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() 方法,Jackson 可以使用该方法。 p>

关于java - 如何修复 Spring 中的 JSON 解码错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54201307/

相关文章:

java - Spring MVC - 没有找到请求 URI 的映射?

java - Spring 启动 : Is it possible to consume @RequestParam's as json?

android - 使用 Jackson Parser 时的默认构造函数问题

java - 从 JSP 页面调用 Selenium Webdriver 脚本

java - 从另一个android项目调用

java - 找到 GPA 最高的学生

spring - jBPM 与 Spring 和 Hibernate 集成的示例项目

java - 无法在 MF8 中省略 json 响应中的空值 - 使用 jackson 注释

java - Jackson - 如何基于 json 内容应用自定义反序列化?

java - Topaz Signature Applet 未连接到 COM1 上的 Serial ClipGem