春季反序列化期间忽略字段?

时间:2019-01-22 06:57:06

标签: java spring-mvc

我想在春季对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的方法。

1 个答案:

答案 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具有工厂方法,可适用于几乎所有实际的过滤方案。正确使用它们。