如何禁用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);
这工作正常,但通过这种方法,创建了一个RepositoryRestHandlerMapping
和EndpointHandlerMapping
。 这些创造了一堆我既不需要也不想要的资源。 我实现我自己的控制器,因为他们需要做比标准的逻辑更多。
我怎样才能防止这种默认行为,并禁用这些映射?
排除主类中的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