Spring-Data @RepositoryRestResource deleteByName 在删除资源时使用了错误的 HTTP 方法
Spring-Data @RepositoryRestResource deleteByName uses wrong HTTP-Method when deleting a resource
我遇到了自定义@RepositoryRestResource 接口方法被错误的 HTTP 方法涉及的情况。例如:
@RepositoryRestResource(path = "matches", collectionResourceRel = "matches")
public interface MatchRepo extends Neo4jRepository<Match, Long> {
Collection<Match> findAllByCodeName(@Param("codeName") String codeName);
@Transactional
Long deleteAllByCodeName(@Param("codeName") String codeName);
}
要求:
curl -i -X GET 'http://localhost:8003/spring-data/api/v1/matches/search/findAllByCodeName?codeName=Test-CodeName-1'
注意上面的 GET HTTP 方法。这是预料之中的,我对回复很满意:
HTTP/1.1 200
Content-Type: application/hal+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Tue, 20 Nov 2018 15:32:49 GMT
{
"_embedded" : {
"matches" : [ {
"id" : "1",
"codeName" : "Test-CodeName-1",
"round" : 1,
"me" : "ROCK",
"pc" : "ROCK",
"result" : "D",
"timestamp" : "Nov 20, 2018, 05:32:27 AM",
"lastUpdated" : "Nov 20, 2018, 05:32:27 AM",
"created" : "Nov 20, 2018, 05:32:27 AM",
"_links" : {
"self" : {
"href" : "http://localhost:8003/spring-data/api/v1/matches/22"
},
"match" : {
"href" : "http://localhost:8003/spring-data/api/v1/matches/22"
}
}
} ]
},
"_links" : {
"self" : {
"href" : "http://localhost:8003/spring-data/api/v1/matches/search/findAllByCodeName?codeName=Test-CodeName-1"
}
}
}%
这是 Intelli-J 控制台映射上显示的内容:
http://localhost:8003/spring-data/api/v1/{repository}/search
& 我按照映射中的指示实现了请求,如下所示。但是,当我使用 GET HTTP-Method 删除资源 时,问题变得很明显,如下所示:
要求:
curl -i -X GET 'http://localhost:8003/spring-data/api/v1/matches/search/deleteAllByCodeName?codeName=Test-CodeName-1'
回复:
HTTP/1.1 200
Content-Type: application/hal+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Tue, 20 Nov 2018 15:51:33 GMT
{
"10":
}
我需要找到一种方法,让我的自定义 deleteAllByCodeName(@Param) 接口方法从 MatchRepo class 以正确的 HTTP 方法执行。必须使用 DELETE HTTP 方法而不是 GET HTTP 方法并遵守 REST-API 设计原则。
手册说明搜索资源只支持GET请求。
您可以阻止导出此 repo 方法:
@RestResource(exported = false)
Long deleteAllByCodeName(@Param("codeName") String codeName);
并创建一个正常的 Spring MVC 控制器来处理删除请求。
我遇到了自定义@RepositoryRestResource 接口方法被错误的 HTTP 方法涉及的情况。例如:
@RepositoryRestResource(path = "matches", collectionResourceRel = "matches")
public interface MatchRepo extends Neo4jRepository<Match, Long> {
Collection<Match> findAllByCodeName(@Param("codeName") String codeName);
@Transactional
Long deleteAllByCodeName(@Param("codeName") String codeName);
}
要求:
curl -i -X GET 'http://localhost:8003/spring-data/api/v1/matches/search/findAllByCodeName?codeName=Test-CodeName-1'
注意上面的 GET HTTP 方法。这是预料之中的,我对回复很满意:
HTTP/1.1 200
Content-Type: application/hal+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Tue, 20 Nov 2018 15:32:49 GMT
{
"_embedded" : {
"matches" : [ {
"id" : "1",
"codeName" : "Test-CodeName-1",
"round" : 1,
"me" : "ROCK",
"pc" : "ROCK",
"result" : "D",
"timestamp" : "Nov 20, 2018, 05:32:27 AM",
"lastUpdated" : "Nov 20, 2018, 05:32:27 AM",
"created" : "Nov 20, 2018, 05:32:27 AM",
"_links" : {
"self" : {
"href" : "http://localhost:8003/spring-data/api/v1/matches/22"
},
"match" : {
"href" : "http://localhost:8003/spring-data/api/v1/matches/22"
}
}
} ]
},
"_links" : {
"self" : {
"href" : "http://localhost:8003/spring-data/api/v1/matches/search/findAllByCodeName?codeName=Test-CodeName-1"
}
}
}%
这是 Intelli-J 控制台映射上显示的内容:
http://localhost:8003/spring-data/api/v1/{repository}/search
& 我按照映射中的指示实现了请求,如下所示。但是,当我使用 GET HTTP-Method 删除资源 时,问题变得很明显,如下所示:
要求:
curl -i -X GET 'http://localhost:8003/spring-data/api/v1/matches/search/deleteAllByCodeName?codeName=Test-CodeName-1'
回复:
HTTP/1.1 200
Content-Type: application/hal+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Tue, 20 Nov 2018 15:51:33 GMT
{
"10":
}
我需要找到一种方法,让我的自定义 deleteAllByCodeName(@Param) 接口方法从 MatchRepo class 以正确的 HTTP 方法执行。必须使用 DELETE HTTP 方法而不是 GET HTTP 方法并遵守 REST-API 设计原则。
手册说明搜索资源只支持GET请求。
您可以阻止导出此 repo 方法:
@RestResource(exported = false)
Long deleteAllByCodeName(@Param("codeName") String codeName);
并创建一个正常的 Spring MVC 控制器来处理删除请求。