You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:38:23