如何修复 Spring 中的 JSON 解码错误?
How to fix JSON decoding error in Spring?
我正在通过包含一组 SimpleGrantedAuthority
对象的 REST 发送用户对象。在接收端,我遇到了一个异常:
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)
注意:您不需要 serializer 因为 SimpleGrantedAuthority
有 Jackson 可以使用的 getAuthority()
方法。
我正在通过包含一组 SimpleGrantedAuthority
对象的 REST 发送用户对象。在接收端,我遇到了一个异常:
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)
注意:您不需要 serializer 因为 SimpleGrantedAuthority
有 Jackson 可以使用的 getAuthority()
方法。