如何禁用RepositoryRestHandlerMapping和EndpointHandlerMapping?

我目前正在使用Spring Boot,Hibernate和Spring-HATEOAS构建一个带有REST接口的应用程序。 我的数据模型被定义为具有@Entity批注的bean,我使用Spring的特性来自动设置一个Hibernate仓库(创建一个扩展PagingAndSortingRepository的界面)。 我的应用程序完全是注解驱动的,也就是说,我没有web.xml但是使用@Configuration @Bean@Configuration @Bean等Spring注解来配置所有的东西,并且在SpringApplication.run(MyApp.class, args);的帮助下从我的main方法启动应用程序SpringApplication.run(MyApp.class, args);

这工作正常,但通过这种方法,创建了一个RepositoryRestHandlerMappingEndpointHandlerMapping 。 这些创造了一堆我既不需要也不想要的资源。 我实现我自己的控制器,因为他们需要做比标准的逻辑更多。

我怎样才能防止这种默认行为,并禁用这些映射?

排除主类中的RepositoryRestMvcAutoConfiguration。

 @EnableAutoConfiguration(exclude = RepositoryRestMvcAutoConfiguration.class) 

我需要其他REST函数,比如@RestController注解。 但我现在自己找到了一个可行的解决方案

RepositoryRestHandlerMapping不应被禁用,但可以通过使用@RepositoryRestResource(exported = false)注释来导出存储库@RepositoryRestResource(exported = false) 。 我在我所有的仓库中都这样做了,现在通配符资源仍然安装,但没有注册仓库来解决它们,使它们有效地消失。 试图访问这样的资源给出了404预期。

EndpointHandlerMapping同样来自spring-boot-actuator并安装了一些端点,如/info/metrics等。这个方法很好用,应该存在于REST应用程序中。 当我用尤里卡服务器注册我的应用程序时,它会自动生成一些链接。 为了正确使用这个端点,例如可以通过@Bean来配置@Bean ,如下所示:

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

上面的info是恒定的信息,如果有信息可能会改变,可以重写InfoEndpoint并提供getAdditionalInfo()的自定义实现。

科特林

  • 排除特定资源:要仅排除特定存储库,请使用以下特定界面中的代码,控制器中的映射仍然有效。

     @Repository @RestResource(exported = false) interface SongRepository : JpaRepository<Song, Int> 
  • 完全:要完全排除,请使用主类中以前答案的Kotlin版本:

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