Как отключить 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>