Использование аннотации RepositoryRestResource для изменения конечной точки RESTful не работает
Я новичок в загрузке Spring. Я пытался создать веб-службу RESTful, которая также подключается к MongoDB.
Все работает отлично, как объясняет руководство, за исключением этого.
package hello.requests;
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import hello.models.CustomerModel;
@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface CustomerRepository extends MongoRepository<CustomerModel, String> {
List<CustomerModel> findByLastName(@Param("name") String name);
}
Здесь я пытаюсь изменить конечную точку RESTful для репозитория по умолчанию от /customerModels
до /people
. Но когда я запускаю это, я получаю 404, если пытаюсь /people
, но отлично работает для /customerModels
.
В более широком смысле, как работает @RepositoryRestResource
?
Что я здесь делаю неправильно?
Ответы
Ответ 1
Не видя всей вашей конфигурации, трудно точно знать, что происходит в вашей ситуации. Однако используя последнее руководство в https://github.com/spring-guides/gs-accessing-data-mongodb.git Я могу заставить его работать, внося следующие изменения:
-
Добавление spring -boot-starter-data-rest в качестве зависимости в файле POM.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
-
Добавление этой аннотации в класс CustomerRepository.
@RepositoryRestResource(path = "people")
-
Настройка геттеров и сеттеров в классе Customer для двух полей имени в конструкторе, чтобы избежать ошибки сериализации Jackson.
Используя это при запуске приложения, я могу получить доступ к репозиторию в http://localhost:8080/people. Если я удалю аннотацию, доступ к CustomerRepository осуществляется по адресу http://localhost:8080/customers. Дайте мне знать, если вы хотите, чтобы я опубликовал вилку на GitHub.
Чтобы ответить на вопрос о том, что такое RepositoryRestResource, он переопределяет атрибуты для ResourceMapping, который создается по умолчанию. Его атрибуты используются при создании сопоставления и изменении соответствующих возвращаемых значений методов класса сопоставления. По умолчанию Spring Data Rest создает значения по умолчанию на основе имен классов объектов, используемых в определении репозитория.
Ответ 2
/customerModels
генерируется по умолчанию, потому что ваш метод по умолчанию возвращает список CustomerModel
. Поэтому вы можете попробовать добавить этот @RestResource(path = "names")
к своему методу, а затем получить доступ к нему так:
http://localhost:8080/yourapp/people/search/names
. Смотрите здесь: Spring docs
Ответ 3
Вы не можете использовать слэш внутри атрибута path
, но вы можете установить базовый путь в application.properties:
# DATA REST (RepositoryRestProperties)
spring.data.rest.base-path=/my/base/uri
# Base path to be used by Spring Data REST to expose repository resources.