我正在通过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)。
谁能向我解释为什么我会收到此错误以及如何解决?
最佳答案
SimpleGrantedAuthority
不适合使用Jackson进行自动映射;它没有argt构造函数,没有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()
方法,Jackson可以使用该方法。