Spring Rest存储库->如何从响应中动态忽略字段

时间:2018-07-11 21:57:54

标签: java spring hibernate jackson spring-data-jpa

我有休息服务,客户希望能够指定端点中返回的字段。

我正在使用PagingAndSortingRepository从模型生成端点。

例如:http://localhost:8080/users 会返回

{
  name: "John",
  age: 23,
  gender: "Male",
  salary: 25000.0
}

他们希望http://localhost:8080/users?fields=name,age,gender返回。.

{
  name: "John",
  age: 23,
  gender: "Male"
}

我可以做一个投影,但是这需要动态,因为我们有很多领域。

这有可能吗?

1 个答案:

答案 0 :(得分:0)

我认为这样做并不是很有价值,但是如果您真的想实现这一目标,那么我已经在GitHub上创建了示例Spring Boot应用程序。

首先,有一个模型来保存数据,并添加@JsonInclude(JsonInclude.Include.NON_NULL)以忽略空字段,如:

@JsonInclude(JsonInclude.Include.NON_NULL)
@Setter
@Getter
@AllArgsConstructor
public class User {
    private String name;
    private Integer age;
    private Float salary;
    private String gender;
}

您的控制器方法将如下所示:

    @GetMapping(produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public User getString(@RequestParam List<String> fields) {
        User user = new User("Yogen", 26, 3000.00f, "male");
        ReflectionUtils.doWithFields(User.class, field -> {
                    if (!fields.contains(field.getName())) {
                        field.setAccessible(true);
                        field.set(user, null);
                    }
                },
                field -> {
                    final int modifiers = field.getModifiers();
                    // no static fields please
                    return !Modifier.isStatic(modifiers);
                });
        return user;
    }

这里我正在使用Spring的ReflectionUtils来过滤字段。

因此,您的请求http://localhost:8089/?fields=name,salary将返回:

{
  "name": "Yogen",
  "salary": 3000
}