Я собрал три подхода для выполнения динамической фильтрации в Джексоне. Один из них должен соответствовать вашим потребностям.
Использование @JsonView
Вы можете использовать @JsonView
:
public class Views {
interface Simple { }
interface Detailed extends Simple { }
}
public class Foo {
@JsonView(Views.Simple.class)
private String name;
@JsonView(Views.Detailed.class)
private String details;
// Getters and setters
}
@RequestMapping("/foo")
@JsonView(Views.Detailed.class)
public Foo getFoo() {
Foo foo = new Foo();
return foo;
}
В качестве альтернативы вы можете установить вид динамически с помощью MappingJacksonValue
.
@RequestMapping("/foo")
public MappingJacksonValue getFoo() {
Foo foo = new Foo();
MappingJacksonValue result = new MappingJacksonValue(foo);
result.setSerializationView(Views.Detailed.class);
return result;
}
Использование BeanSerializerModifier
Вы можете расширить BeanSerializerModifier
, а затем переопределить метод changeProperties()
. Он позволяет добавлять, удалять или заменять любые свойства для сериализации в соответствии с вашими потребностями:
public class CustomSerializerModifier extends BeanSerializerModifier {
@Override
public List<BeanPropertyWriter> changeProperties(SerializationConfig config,
BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
// In this method you can add, remove or replace any of passed properties
return beanProperties;
}
}
Затем зарегистрируйте сериализатор как модуль в вашем ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new SimpleModule() {
@Override
public void setupModule(SetupContext context) {
super.setupModule(context);
context.addBeanSerializerModifier(new CustomSerializerModifier());
}
});
Проверьте примеры здесь и здесь .
Использование @JsonFilter
с SimpleBeanPropertyFilter
Другой подход включает @JsonFilter
:
@JsonFilter("customPropertyFilter")
public class Foo {
private String name;
private String details;
// Getters and setters
}
Расширьте SimpleBeanPropertyFilter
и переопределите метод serializeAsField()
в соответствии с вашими потребностями:
public class CustomPropertyFilter extends SimpleBeanPropertyFilter {
@Override
public void serializeAsField(Object pojo, JsonGenerator jgen,
SerializerProvider provider,
PropertyWriter writer) throws Exception {
// Serialize a field
// writer.serializeAsField(pojo, jgen, provider, writer);
// Omit a field from serialization
// writer.serializeAsOmittedField(pojo, jgen, provider);
}
}
Затем зарегистрируйте фильтр в вашем ObjectMapper
:
FilterProvider filterProvider = new SimpleFilterProvider()
.addFilter("customPropertyFilter", new CustomPropertyFilter());
ObjectMapper mapper = new ObjectMapper();
mapper.setFilterProvider(filterProvider);
Если вы хотите сделать свой фильтр «глобальным» , то есть применить его ко всем bean-компонентам, вы можете создать смешанный класс и аннотировать его с помощью @JsonFilter("customPropertyFilter")
:
@JsonFilter("customPropertyFilter")
public class CustomPropertyFilterMixIn {
}
Затем привяжите смешанный класс к Object
:
mapper.addMixIn(Object.class, CustomPropertyFilterMixIn.class);