我正在通过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)。
有人可以向我解释为什么我会收到此错误以及如何解决该错误吗?
答案 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()
方法,杰克逊可以使用。