I have a class which holds a collection of another class.
class A{
@JsonView(VerboseViewA.Minimal.class)
String field1;
@JsonView(VerboseViewA.Complete.c
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.
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;
}
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.