Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

Anotação do @Expose no id - Spring com extends AbstractPersistable

Como anoto com o @Expose o id uma vez que o Spring que o gerencia com o extends AbstractPersistable , e não tenho acesso a ele(id), para gerar o json com gson ou outro?

10 respostas

O spring vem com suporte pronto para o jackson, esquece o gson e usa ele.

oi Clerman

Se voce for manter o GSON como sua biblioteca, existe essa opcao: https://google.github.io/gson/apidocs/com/google/gson/ExclusionStrategy.html

E la tem o exemplo que voce quer:

Excludes fields and objects based on a particular annotation:

 public @interface ExcludesAnnotation {
   // some implementation here
 }

 // Excludes any field (or class) that is tagged with an "@FooAnnotation"
 private static class ExcludesExclusionStrategy implements ExclusionStrategy {
   public boolean shouldSkipClass(Class<?> clazz) {
     return clazz.getAnnotation(FooAnnotation.class) != null;
   }

   public boolean shouldSkipField(FieldAttributes f) {
     return f.getAnnotation(FooAnnotation.class) != null;
   }
 }

Claro, dê um nome mais bonito pra sua anotacao, e anote aquele campo que tem referencia circular (bem mais bonito que lotar as classes com Expose).

Ai faz mais ou menos assim:

 ExclusionStrategy estrategia = new ExcludesExclusionStrategy();
// aqui vc precisa de um FieldsAttrbutes, que basta fazer reflection e passar pro construtor dele
estrategia.shouldSkipField(passa o attributes aqui);

 Gson gson = new GsonBuilder()
     .setExclusionStrategies(estrategia)
     .create();

A outra opcao seria usar outro framework de json, como o jackson https://github.com/FasterXML/jackson

Opa, com o jackson, vc pode, em cima da sua classe fazer assim:

@JsonIgnoreProperties(value = { "nomeDoAtributoQueVcQuerIgnorar" })

Agora tenho uma dúvida, uso o jackson que já tem suporte do Spring ou devo usar Gson que provavelmente terei que fazer, mais pra frente uma série de implementações?

Agora tenho uma dúvida, uso o jackson que já tem suporte do Spring ou devo usar Gson que provavelmente terei que fazer, mais pra frente uma série de implementações?

e fazendo com o jackson já me da o erro:

com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: 
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:689)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:149)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:111)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:149)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:111)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:149)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:111)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:149)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:111)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:149)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:111)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:149)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:111)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:149)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:111)
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693)

Opa, Eu faria um teste com o Jackson mesmo.

Paulo essa é uma interface? Onde posso criá-la? @interface ExcludesAnnotation e essa classe ExcludesExclusionStrategy onde coloco também?

ok Alberto, estou tentando aqui, mas veja o erro acima por favor!

Deu certo aqui Alberto com o Jackson. Tem uma classe que quero ocultar o id, funciona da mesma forma?

solução!

Opa, funciona sim :). Que bom que deu certo.