Estou enviando um objeto Usuário através de repouso, que contém um conjunto de SimpleGrantedAuthority
objetos. No lado do receptor, estou recebendo uma exceção:
org.springframework.core.codec.DecodingException: JSON descodificação de erro: Não é possível construir exemplo de
org.springframework.security.core.authority.SimpleGrantedAuthority
(embora, pelo menos, um Criador existe): não é possível a partir de desserializá valor objecto (não delegate- ou Criador à base de propriedade);
Estou usando o mapeador de JSON padrão que Primavera Bota 2.1.2 fornece. No lado de receber, estou usando o WebClient do WebFlux (WebTestClient neste caso).
Alguém pode me explicar por que estou recebendo este erro e como resolvê-lo?
SimpleGrantedAuthority
não é adequado para o mapeamento automático com Jackson; ele tem construtor não não-arg e sem setter para o authority
campo.
Então, ele precisa de um costume desserializador . Algo assim:
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());
}
}
Registre-lo com Jackson em todo o mundo como este:
objectMapper.registerModule(new SimpleModule().addDeserializer(
SimpleGrantedAuthority.class, new SimpleGrantedAuthorityDeserializer()));
Ou anotar o campo (s) com:
@JsonDeserialize(using = SimpleGrantedAuthorityDeserializer.class)
Nota: você não precisa de um serializer porque SimpleGrantedAuthority
tem o getAuthority()
método, que é utilizável por Jackson.