我有一个使用Spring Data Rest和JPA的非常简单的示例,该示例公开了人员资源。启动应用程序时,它可以按预期工作,并且我可以发布和获取资源实例。
针对/ person发送GET时,会收到以下响应:
"_embedded": {
"person": [
{
"firstName": "FN",
"lastName": "LN",
"_links": {
"self": {
"href": "http://localhost:9090/person/1"
},
"person": {
"href": "http://localhost:9090/person/1"
},
"address": {
"href": "http://localhost:9090/person/1/address"
}
}
}
]
},
"_links": {
"self": {
"href": "http://localhost:9090/person{?page,size,sort}",
"templated": true
},
"profile": {
"href": "http://localhost:9090/profile/person"
},
"search": {
"href": "http://localhost:9090/person/search"
}
},
"page": {
"size": 20,
"totalElements": 1,
"totalPages": 1,
"number": 0
}
}
您可以看到人员资源具有一个FN值的firstName属性。
我的问题是,以下GET查询是否可以立即使用?
/ person?firstName = FN
或者这需要使用自定义搜索方法来实现吗?
不用说它对我不起作用,但是我看到关于是否已开箱即用的信息存在冲突。
预先感谢
答案 0 :(得分:0)
我的问题是,以下GET查询是否可以立即使用?
不。您将收到类似
的错误{
"cause": {
"cause": null,
"message": "For input string: \"findByName\""
},
"message": "Failed to convert from type [java.lang.String] to type [java.lang.Long] for value 'findByName'; nested exception is java.lang.NumberFormatException: For input string: \"findByName\""
}
Spring Data Rest具有以下URL结构。 / {pluralEntityName} / {primaryKey},例如,当实体名称为Person且主键为Long时,它将为/ persons / 1
我们看到此错误消息,因为Spring Date Rest尝试将实体名称后的第二个参数转换为该实体的主键。在我的Person实体中,主键为Long,因此它将尝试将findByName
转换为Long并失败。
或者这需要使用自定义搜索方法来实现吗?
是的,如果要在存储库中进行搜索,则需要按照Spring Data JPA的方法名称约定在存储库中编写一个方法,然后Spring Data JPA会自动将该方法转换为SQL查询,而Spring Data Rest将自动将此方法公开为端点。
例如,如果您编写如下方法: 列出findByNameContains(String name);
该方法将在Spring Data Rest中公开,您将能够从以下端点访问它: http://localhost:8080/persons/search/findByNameContains?name=Mahsum
顺便说一句,您可以通过访问http://localhost:8080/persons/search
查看所有可用的搜索方法