删除资源时,Spring-Data @RepositoryRestResource deleteByName使用错误的HTTP方法

时间:2018-11-20 16:02:02

标签: spring-data spring-data-rest spring-data-neo4j spring-hateoas spring-repositories

我遇到了一个错误的HTTP方法涉及定制@RepositoryRestResource接口方法的情况。例如:

@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方法删除资源时,问题变得很明显,如下所示:

请求:

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": 
}

我需要找到一种方法,使MatchRepo类中的自定义deleteAllByCodeName(@Param)接口方法能够使用正确的HTTP方法执行。必须使用DELETE HTTP方法而不是GET HTTP方法,并遵守REST-API设计原则。

1 个答案:

答案 0 :(得分:0)

该手册指出搜索资源仅支持GET请求。

https://docs.spring.io/spring-data/rest/docs/3.1.2.RELEASE/reference/html/#repository-resources.search-resource

您可以阻止此回购方法导出:

@RestResource(exported = false)
Long deleteAllByCodeName(@Param("codeName") String codeName);

并创建一个处理删除请求的普通Spring MVC控制器。