我想在春季对json数据进行反序列化时忽略某些字段。我不能使用@JsonIgnore,因为同一模型将用于不同的方法,并且需要忽略不同的字段。 我试图用下面的例子来解释这种情况。
class User
{
private String name;
private Integer id;
//getters and setters
}
这是将用作模型的User类。
@RequestMapping(value = '/path1', method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<CustomResponse> loadUser1(@RequestBody User user){
System.out.println(user.name);
//user.id is not required here
}
这是第一种使用user.name并忽略user.id的方法。
@RequestMapping(value = '/path2', method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<CustomResponse> loadUser2(@RequestBody User user){
System.out.println(user.id);
//user.name is not required here
}
这是第二种使用user.id并忽略user.name的方法。
答案 0 :(得分:0)
您可以使用@JsonFilter
进行动态过滤。
首先,使用com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter
创建一个过滤器,并将其传递给过滤器提供者com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider
。
然后,使用@JsonFilter
在您的bean上声明此过滤器。
在您的情况下,这可以做到:
@JsonFilter("myFilter")
public class User {
private String name;
private int id;
// Getters and setters
}
这会将过滤器应用于您的POJO:
public MappingJacksonValue getFiltered() {
SimpleFilterProvider filterProvider = new SimpleFilterProvider();
filterProvider.addFilter("myFilter", SimpleBeanPropertyFilter.filterOutAllExcept("id"));
User user = new User();
user.setId(1);
user.setName("Me");
MappingJacksonValue jacksonValue = new MappingJacksonValue(user);
jacksonValue.setFilters(filterProvider);
return jacksonValue;
}
编辑:
SimpleBeanPropertyFilter
具有工厂方法,可适用于几乎所有实际的过滤方案。正确使用它们。