我目前正在使用Spring Boot创建一个带有mongodb后端的REST API。是否可以在查看特定项目时仅显示某些字段,而不是项目列表?
例如,在查看用户列表时,仅显示电子邮件,名称和ID:
GET /{endpoint}/users
{
"_embedded": {
"users": [
{
"email": "some_email@gmail.com",
"name": "some name",
"id": "57420b2a0d31bb6cef4ee8e9"
},
{
"email": "some_other_email@gmail.com",
"name": "some other name",
"id": "57420f340d31cd8a1f74a84e"
}
]
}
但是暴露额外的字段,例如搜索特定用户时的地址和性别:
GET /{endpoint}/users/57420f340d31cd8a1f74a84e
{
"email": "some_other_email@gmail.com",
"name": "some other name",
"address": "1234 foo street"
"gender": "female"
"id": "57420f340d31cd8a1f74a84e"
}
给定用户类:
public class User {
private String id;
private String email;
private String address;
private String name;
private String gender;
...
}
答案 0 :(得分:6)
使用Spring Data REST时,它有一些特别为此设计的东西。有Projections and Excerpts的概念,您可以指定要返回的内容和方式。
首先,您将创建一个仅包含所需字段的界面。
@Projection(name="personSummary", types={Person.class})
public interface PersonSummary {
String getEmail();
String getId();
String getName();
}
然后在PersonRepository
上添加此作为默认使用(仅适用于返回集合的方法!)。
@RepositoryRestResource(excerptProjection = PersonSummary.class)
public interface PersonRepository extends CrudRepository<Person, String> {}
然后,当对集合进行查询时,您将只获得投影中指定的字段,并且在获取单个实例时,您将获得完整对象。
答案 1 :(得分:1)
您必须在存储库中的find方法上添加@Query
注释,并指定fields
参数:
public interface PersonRepository extends MongoRepository<Person, String>
@Query(value="{ 'firstname' : ?0 }", fields="{ 'firstname' : 1, 'lastname' : 1}")
List<Person> findByThePersonsFirstname(String firstname);
}