SimpleGrantedAuthority

SimpleGrantedAuthority

我正在通过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可以使用该方法。

10-05 18:45