Pregunta

I have a class which holds a collection of another class.

class A{
 @JsonView(VerboseViewA.Minimal.class)
 String field1;
 @JsonView(VerboseViewA.Complete.class)
 String field2;
 @JsonView(VerboseViewA.Complete.class)
 Collection<B> bEntities;
}

class B{
   @JsonView(VerboseViewB.Minimal.class)
    String field2;
   @JsonView(VerboseViewB.Complete.class)
    String field3;
 }

When i serialize Class A using VerboseViewA.Complete, i want the collection bEntities to be serialized using VerboseViewB.Minimal.

Is there a way to achieve it?

¿Fue útil?

Solución

This solves my problem. I ain't sure if there is a better way to solve this.

 class A{
  @JsonView(VerboseViewA.Minimal.class)
  String field1;
  @JsonView(VerboseViewA.Complete.class)
  String field2;
  @JsonView(VerboseViewA.Complete.class)
  Collection<B> bEntities;
 }

 class B{
    @JsonView({VerboseViewA.Complete.class,VerboseViewB.Minimal.class})
    String field2;
    @JsonView(VerboseViewB.Complete.class)
    String field3;
 }

Otros consejos

After struggling with the same problem, I came up to this solution:

class A
{
    @JsonView(VerboseViewA.Minimal.class)
    String field1;
    @JsonView(VerboseViewA.Complete.class)
    String field2;
    @JsonView(VerboseViewA.Complete.class)
    @JsonSerialize(using = VerboseMinimalSerializer.class)
    Collection<B> bEntities;
}

class B
{
    @JsonView(VerboseViewB.Minimal.class)
    String field2;
    @JsonView(VerboseViewB.Complete.class)
    String field3;
}

Now when serializing an instance of class A using VerboseViewA.Complete.class, bEnitities will be included and serialized using a custom VerboseMinimalSerializer, overriding its JsonView:

public class VerboseMinimalSerializer extends JsonSerializer<Object>
{
    @Override
    public void serialize(Object object, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException
    {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
        mapper.setSerializationInclusion(Include.NON_NULL);
        mapper.setConfig(mapper.getSerializationConfig().withView(VerboseViewB.Minimal.class));

        jsonGenerator.setCodec(mapper);
        jsonGenerator.writeObject(object);
    }
}

Notice this custom serializer is using the view VerboseViewB.Minimal.class.

you need to change your json view hierachy a little:

public class MinimalView { };
public class AComplete extends MinimalView { };
public class BComplete extends MinimalView { };

then you can annotate your classes like

class A{
    @JsonView(MinimalView.class)
    String field1;
    @JsonView(AComplete.class)
    String field2;
    @JsonView(AComplete.class)
    Collection<B> bEntities;
 }

class B{
    @JsonView(Minimal.class)
    String field2;
    @JsonView(BComplete.class)
    String field3;
}

when you serialize using the view AComplete, the serializer will take the AComplete and MinimalView properties because AComplete extends MinimalView.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top