Как отключить RepositoryRestHandlerMapping и EndpointHandlerMapping?

В настоящее время я создаю приложение с интерфейсом REST, используя Spring Boot, Hibernate и Spring -HATEOAS. Моя модель данных определяется как beans с аннотацией @Entity, и я использую функцию Spring для автоматической настройки репозитория Hibernate (создание интерфейса, расширяющего PagingAndSortingRepository). Мое приложение полностью управляется аннотациями, т.е. У меня нет web.xml, но настройте все с помощью аннотаций Spring, таких как @Configuration, @Bean и т.д., И запустите приложение из моего метода main с помощью SpringApplication.run(MyApp.class, args);

Это отлично работает, но при таком подходе создается RepositoryRestHandlerMapping и EndpointHandlerMapping. Они создают кучу ресурсов, которые мне не нужны и не нужны. Я реализую свои собственные контроллеры, потому что они должны выполнять больше, чем стандартная логика.

Как я могу предотвратить это поведение по умолчанию и отключить эти сопоставления?

Ответ 1

Мне нужны другие функции REST, например аннотация @RestController. Но сейчас я нашел подходящее решение:

RepositoryRestHandlerMapping не следует отключать, но можно отключить экспорт репозиториев, аннотируя их с помощью @RepositoryRestResource(exported = false). Я сделал это со всеми моими репозиториями, и теперь ресурсы подстановочных знаков все еще установлены, но репозитории не регистрируются, чтобы разрешить их, что делает их фактически исчезающими. Попытка доступа к такому ресурсу дает 404, как ожидалось.

То же самое для EndpointHandlerMapping, которое исходит от spring-boot-actuator и устанавливает некоторые конечные точки, такие как /info, /metrics и т.д. Это удобно и должно присутствовать в приложении REST; когда я регистрирую свое приложение на сервере Eureka, он автоматически создает ссылки на некоторые из них. Чтобы использовать это правильно, конечные точки можно, например, настроить через @Bean, например:

@Configuration
public class InfoConfiguration {

    @Bean
    public InfoEndpoint infoEndpoint {
        Map<String, Object> info = ...
        return new InfoEndpoint(info);
    }
}

info выше - постоянная информация, если есть информация, которая может быть изменена, можно переопределить InfoEndpoint и предоставить пользовательскую реализацию getAdditionalInfo().

Ответ 2

Исключить RepositoryRestMvcAutoConfiguration в вашем основном классе.

@EnableAutoConfiguration(exclude = RepositoryRestMvcAutoConfiguration.class)

Ответ 3

Котлин

  • Исключить конкретный ресурс: Чтобы исключить только конкретный репозиторий, используйте код ниже в конкретном интерфейсе, отображение в контроллере будет по-прежнему работать.

    @Repository
    @RestResource(exported = false)
    interface SongRepository : JpaRepository<Song, Int>
    
  • Полностью: Чтобы полностью исключить, используйте версию предыдущих ответов Kotlin в основном классе:

     @SpringBootApplication
     @EnableAutoConfiguration(exclude = arrayOf(RepositoryRestMvcAutoConfiguration::class))
     class WebserviceApplication
    

Ответ 4

использовать ниже зависимости

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>

вместо

   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>