我有一个具有多个@ManyToOne关联的实体。我正在使用spring-boot公开REST API。当前,我有多个REST API,它们返回整个实体(包括关联)的JSON响应。
@ManyToOne
但是我不想序列化所有REST API中的所有关联对象。
例如
因此,在我的序列化过程中,我想忽略除API-1的associationA以外的所有关联。
对于API-2,我想忽略除A和B以外的其他关联
如何在Jackson序列化过程中动态忽略这些属性?
注意:我每个人都使用相同的类;我对为每个API创建DTO都不感兴趣。
任何建议都将受到赞赏。
我汇总了三种在Jackson中执行动态过滤的方法。其中之一必须满足您的需求。
@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。
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()方法。它允许您根据需要添加,删除或替换任何要序列化的属性:
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
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()方法:
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")
@JsonFilter("customPropertyFilter") public class CustomPropertyFilterMixIn { }
然后将混合类绑定到Object:
Object
mapper.addMixIn(Object.class, CustomPropertyFilterMixIn.class);