如何配置Spring @RepositoryRestResource端点仅响应指定MIME类型请求
让Spring @RepositoryRestResource仅响应application/json请求的几种方法
嘿,刚好你提到了用@RequestMapping通过headers限制Accept头的思路,针对@RepositoryRestResource其实可以用类似的逻辑,甚至有更适配的配置方式,下面给你详细说说:
方法1:直接在Repository接口上添加headers限制
因为@RepositoryRestResource本质上是基于Spring MVC的注解,所以可以直接结合@RequestMapping的headers属性,给整个Repository的所有REST端点加上Accept头限制:
@RepositoryRestResource(collectionResourceRel = "users", path = "users") @RequestMapping(headers = "Accept=application/json") public interface UserRepository extends JpaRepository<User, Long> { // 这里的所有默认端点(比如GET /users、GET /users/{id}等)都会仅响应Accept为application/json的请求 }
当请求没有携带Accept: application/json头时,会返回406 Not Acceptable状态码,符合你要的“仅在指定MIME类型时返回响应”的需求。
方法2:针对单个查询方法单独限制
如果不需要整个Repository都限制,只想给某个自定义查询接口加限制,可以在查询方法上单独用@GetMapping(或其他请求注解)并指定headers:
@RepositoryRestResource(collectionResourceRel = "users", path = "users") public interface UserRepository extends JpaRepository<User, Long> { // 这个查询接口仅响应Accept=application/json的请求 @GetMapping(path = "/by-email", headers = "Accept=application/json") List<User> findByEmail(@Param("email") String email); // 其他默认接口不受影响,依然会处理符合默认媒体类型的请求 }
方法3:全局配置所有RepositoryRestResource端点
如果想让项目中所有的@RepositoryRestResource端点都只响应application/json请求,可以通过配置RepositoryRestConfigurer来全局设置:
@Configuration public class RestRepoGlobalConfig implements RepositoryRestConfigurer { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { // 设置默认媒体类型为application/json config.setDefaultMediaType(MediaType.APPLICATION_JSON); // 关闭HAL格式的默认JSON媒体类型,强制使用纯application/json config.useHalAsDefaultJsonMediaType(false); } @Override public void configureHttpMessageConverters(List<HttpMessageConverter<?>> converters) { // 移除其他类型的消息转换器,只保留JSON转换器 converters.removeIf(converter -> !(converter instanceof MappingJackson2HttpMessageConverter)); } }
这样配置后,所有Repository的REST端点都会拒绝非application/json的请求,统一返回406状态码。
本质上这些方法和你用@RequestMapping限制headers的逻辑是一致的,都是通过校验请求头的Accept值来控制响应的触发~
内容的提问来源于stack exchange,提问作者nAku
相关产品推荐
相关产品推荐

