Поддерживает ли Sprint Data Rest нестандартные запросы столбцов? - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть очень простой пример использования Spring Data Rest и JPA, который раскрывает личные ресурсы. При запуске приложения оно работает как положено, и я могу POST и GET экземпляры ресурса.

При отправке GET против / person я получаю следующий ответ:

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

Как видите, ресурс person имеет атрибут firstName со значением FN.

Мой вопрос: должен ли следующий запрос GET работать из коробки?

/ персона? FirstName = FN

или это то, что нужно реализовать с помощью специального метода поиска?

Само собой разумеется, что это не работает для меня, но я вижу противоречивую информацию о том, поддерживается ли она из коробки.

Заранее спасибо,

1 Ответ

0 голосов
/ 18 апреля 2019

Мой вопрос: должен ли следующий запрос 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./ {множественное имя_принятия} / {primaryKey}, например, когда имя сущности равно Person, а первичный ключ - Long, это будет / person / 1

Мы видим это сообщение об ошибке, потому что Spring Date Rest пытается преобразовать второй аргумент послеимя объекта для первичного ключа этого объекта.В моей сущности Person первичный ключ - Long, поэтому он пытается преобразовать findByName в Long и завершается неудачей.

или это необходимо реализовать с помощью специального метода поиска?

Да, если вы хотите выполнить поиск в хранилище, вам нужно написать метод в хранилище, следуя соглашениям с именами методов Spring Data JPA, тогда Spring Data JPA автоматически преобразует этот метод в запрос SQL, и SpringData Rest автоматически представит этот метод в качестве конечной точки.

например, если вы напишите такой метод, как: List findByNameContains (String name);

Этот метод будет представлен с помощью Spring Data Rest, и выполучить доступ к нему из следующей конечной точки: http://localhost:8080/persons/search/findByNameContains?name=Mahsum

Кстати, вы можете увидеть все доступные методы поиска, посетив http://localhost:8080/persons/search

...