我有休息服务,客户希望能够指定端点中返回的字段。
我正在使用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"
}
我可以做一个投影,但是这需要动态,因为我们有很多领域。
这有可能吗?
答案 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
}