Spring-Data @RepositoryRestResource deleteByName использует неправильный HTTP-метод при удалении ресурса - PullRequest
0 голосов
/ 20 ноября 2018

Я столкнулся со сценарием, в котором пользовательский интерфейсный метод @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-метода , как показано ниже:

Запрос:

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 для выполнения с правильным HTTP-методом.Необходимо использовать DELETE HTTP-метод, а не GET HTTP-метод и придерживаться принципов проектирования REST-API.

1 Ответ

0 голосов
/ 20 ноября 2018

В руководстве отмечается, что поисковые ресурсы поддерживают только запросы 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, который обрабатывает запрос на удаление.

...