Resumindo, uma das minhas entidades tem um GeometryCollection que lança uma exceção quando você chama "getBoundary" (o porquê disso é outro livro, por enquanto digamos que é assim que funciona).
Existe uma maneira de dizer a Jackson para não incluir aquele getter específico? Sei que posso usar @JacksonIgnore quando possuo / controlo o código. Mas este não é o caso, jackson termina atingindo este ponto através da serialização contínua dos objetos pais. Eu vi uma opção de filtragem na documentação de jackson. Essa é uma solução plausível?
Obrigado!
objectMapper.addMixInAnnotations(Class<?> target, Class<?> mixinSource);
Uma outra possibilidade é, se você deseja ignorar todas as propriedades desconhecidas, você pode configurar o mapeador da seguinte forma:
fonte
mapper.configure(DeserializationFeature.failOnUnknownPropertiesExcep(new String[] {"myField"}));
without()
como em:mapper.reader().without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
Usando a classe Java
Usando Anotação
fonte
A abordagem baseada em anotações é melhor. Mas às vezes a operação manual é necessária. Para este efeito, você pode usar sem método de ObjectWriter .
fonte
As anotações mix-in funcionam muito bem aqui, como já foi mencionado. Outra possibilidade além de @JsonIgnore por propriedade é usar @JsonIgnoreType se você tiver um tipo que nunca deve ser incluído (ou seja, se todas as instâncias das propriedades GeometryCollection devem ser ignoradas). Você pode então adicioná-lo diretamente (se você controlar o tipo) ou usando o mix-in, como:
Isso pode ser mais conveniente se você tiver muitas classes em que todas tenham um único acessador 'IgnoredType getContext ()' ou algo assim (que é o caso de muitos frameworks)
fonte
Eu tive um problema semelhante, mas estava relacionado aos relacionamentos bidirecionais do Hibernate. Eu queria mostrar um lado do relacionamento e ignorar programaticamente o outro, dependendo de qual visão eu estava lidando. Se você não puder fazer isso, acabará com
StackOverflowException
s desagradáveis . Por exemplo, se eu tivesse esses objetosGostaria de ignorar programaticamente o
parent
campo em B se estivesse olhando para A e ignorar ochildren
campo em A se estivesse olhando para B.Comecei usando mixins para fazer isso, mas rapidamente se tornou horrível; você tem tantas classes inúteis espalhadas que existem apenas para formatar dados. Acabei escrevendo meu próprio serializador para lidar com isso de uma forma mais limpa: https://github.com/monitorjbl/json-view .
Ele permite que você especifique programaticamente quais campos ignorar:
Ele também permite que você especifique facilmente visualizações muito simplificadas por meio de correspondências de curinga:
No meu caso original, a necessidade de visualizações simples como essa era mostrar o mínimo sobre o pai / filho, mas também se tornou útil para nossa segurança baseada em funções. Visualizações menos privilegiadas de objetos são necessárias para retornar menos informações sobre o objeto.
Tudo isso vem do serializador, mas eu estava usando Spring MVC em meu aplicativo. Para fazer com que ele lide adequadamente com esses casos, escrevi uma integração que você pode colocar nas classes de controlador Spring existentes:
Ambos estão disponíveis no Maven Central. Espero que ajude alguém por aí, este é um problema particularmente feio com Jackson que não tinha uma boa solução para o meu caso.
fonte
Match.match()
?Se você quiser SEMPRE excluir certas propriedades de qualquer classe, você pode usar o
setMixInResolver
método:fonte
Mais um ponto bom aqui é usar
@JsonFilter
. Alguns detalhes aqui http://wiki.fasterxml.com/JacksonFeatureJsonFilterfonte