Использование аннотации 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.