我正在尝试在Spring Boot 2中动态序列化给定的POJO。 我的用例是,我有一个很大的模型文件,我只想检索字段的子集。我在互联网上发现的方法是使用@JacksonFilter,即使用@JsonFilter注释POJO,并在序列化时使用该过滤器名称。
下面是代码示例
@JsonFilter("myfilter")
class Resource1{
String firstName;
String lastName;
Address address;
}
class Address {
String addr1;
String addr2;
String zipcode;
}
在序列化时,如果我只想要名字,我会这样做
SimpleFilterProvider filterProvider = SimpleFilterProvider()
filterProvider.addFilter("myfilter",
SimpleBeanPropertyFilter.filterOutAllExcept("firstName"))
ObjectMapper mapper = ObjectMapper()
mapper.setFilterProvider(filterProvider)
mapper.writeValueAsString(resource1_instance) // Resource 1 instance
现在,例如,我想过滤另一个POJO,我需要为该给定的类声明JsonFilter,并且对任何给定的POJO重复此操作。
我的担心是,为了仅动态序列化字段的子集,对于每个给定的POJO,我们需要添加@JsonFilter(“ suitable_name”)并对其进行序列化。
有没有一种方法可以声明通用@JsonFilter并像继承概念一样重用它。
如果我使用@JsonIgnore,它将是静态且固定的。
我的要求是,如果模型具有v,w,x,y,z属性,而我在运行时仅请求x,y属性,则该通用过滤器将仅序列化POJO的x,y属性并还给我< / p>
任何对此的建议都会有很大帮助。预先感谢
答案 0 :(得分:1)
对于更简单的用例的动态过滤,我为杰克逊编写了一个插件,以使用蚂蚁风格过滤。它应该正是您搜索的内容。
答案 1 :(得分:0)
是的,我们可以动态决定并创建通用过滤器。
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
FilterProvider filters = new SimpleFilterProvider().setFailOnUnknownId(false).addFilter("CustomerFilter",
SimpleBeanPropertyFilter.filterOutAllExcept("customerId"));
ObjectWriter writer = mapper.writer(filters);
String writeValueAsString = writer.writeValueAsString(customer);
Customer resultCustomer = mapper.readValue(writeValueAsString, Customer.class);
return ResponseEntity.status(HttpStatus.OK).body(resultCustomer);
在上面创建过滤器的代码片段中,您可以将集合作为输入传递。检查下面的片段 根据您的要求,接受 set 作为方法输入,其中有时包含 x,y,有时包含 w,x。
FilterProvider filters = new SimpleFilterProvider().setFailOnUnknownId(false).addFilter("CustomerFilter",
SimpleBeanPropertyFilter.filterOutAllExcept(set));