@RepositoryRestController方法produces设置无效,如何修改响应Content-Type
嘿,这个坑我踩过!先给你明确:@RepositoryRestController确实自带HAL JSON的默认包装逻辑,它是Spring Data REST专门用来返回RESTful资源的控制器,默认会把所有响应都套上HAL的JSON结构,哪怕你在@GetMapping里设置了produces = MediaType.TEXT_PLAIN_VALUE,也会被它的全局处理逻辑覆盖掉。
不过别慌,有几种靠谱的方法能让你拿到想要的text/plain响应头:
方法一:换用普通@Controller(最简单直接)
如果这个returnText方法不需要Spring Data REST的HAL特性(比如资源链接、分页包装这些),直接把控制器注解换成@Controller就搞定了:
@Controller @RequestMapping(value = "users") public class UserController { // ...其他方法... @GetMapping(value = "returnText", produces = MediaType.TEXT_PLAIN_VALUE) public String returnText() { return "my text"; } }
这时候再用Postman调用,响应头的Content-Type就会是text/plain,返回的就是纯文本内容。
方法二:用ResponseEntity手动指定(保留RepositoryRestController特性)
要是你还想保留@RepositoryRestController给其他方法带来的便利,那可以用ResponseEntity手动构建响应,绕过默认的HAL包装:
@RepositoryRestController @RequestMapping(value = "users") public class UserController { // ...其他方法... @GetMapping(value = "returnText") public ResponseEntity<String> returnText() { return ResponseEntity.ok() .contentType(MediaType.TEXT_PLAIN) .body("my text"); } }
这种方式只针对这个方法生效,其他方法依然可以正常返回HAL JSON。
方法三:全局配置禁用HAL包装(适合全接口调整)
如果你的整个控制器都不需要HAL格式,那可以写个配置类修改Spring Data REST的默认行为:
@Configuration public class SpringDataRestCustomConfig implements RepositoryRestConfigurer { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { // 禁用默认的HAL暴露逻辑 config.disableDefaultExposure(); // 或者指定媒体类型映射 config.getMediaTypeMappings().put("text/plain", MediaType.TEXT_PLAIN); } }
不过这个是全局设置,会影响所有@RepositoryRestController的响应,得根据你的实际业务需求来选。
最后再补一句:@RepositoryRestController不是只能返回HAL JSON,只是它默认这么做,通过上面的方法完全可以自定义响应的Content-Type~
内容的提问来源于stack exchange,提问作者st.

