Spring Boot中使用CrudRepository如何去除响应中的额外_links JSON属性
去除Spring Boot中CrudRepository响应JSON的_links属性
这个_links属性其实是Spring HATEOAS生成的HAL(超文本应用语言)格式的一部分,当你使用Spring Data REST自动暴露CrudRepository接口时,默认会返回这种带链接的HAL格式JSON,目的是为客户端提供REST交互的导航能力。如果不需要这个属性,可以通过以下几种方式解决:
方案一:自己编写Controller,手动返回实体对象
如果你不需要Spring Data REST自动生成的REST端点,最直接的方式就是自己写Controller来处理请求,直接返回实体类对象,这样序列化后的JSON就只会包含你实体里定义的字段,不会有额外的_links。
示例代码:
@RestController @RequestMapping("/users") public class UserController { private final UserRepository userRepository; // 构造注入 public UserController(UserRepository userRepository) { this.userRepository = userRepository; } @GetMapping public List<User> getAllUsers() { return (List<User>) userRepository.findAll(); } @GetMapping("/{id}") public ResponseEntity<User> getUserById(@PathVariable Long id) { return userRepository.findById(id) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } }
方案二:全局禁用HAL格式
如果想继续使用Spring Data REST的自动端点,但全局关闭HAL格式,只返回纯JSON,可以在application.properties(或application.yml)中添加配置:
application.properties
spring.hateoas.use-hal-as-default-json-media-type=false
application.yml
spring: hateoas: use-hal-as-default-json-media-type: false
配置后,Spring Data REST返回的响应就会是普通的JSON结构,不再包含_links和_embedded。
方案三:在实体类上忽略_links属性
通过Jackson的注解,直接在实体类上标记忽略_links属性,这样序列化时会自动跳过该字段:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties({"_links"}) public class User { private Long id; private String user_name; // getter、setter、构造方法等 }
方案四:使用自定义Projection(针对Spring Data REST)
如果只想暴露实体的部分字段,同时去掉_links,可以定义一个Projection接口,指定需要返回的字段,然后在Repository上配置使用这个Projection:
1. 定义Projection接口
import org.springframework.data.rest.core.config.Projection; @Projection(name = "userBasic", types = User.class) public interface UserBasicProjection { // 只暴露你需要的字段 String getUser_name(); }
2. 在Repository上配置默认Projection
import org.springframework.data.repository.CrudRepository; import org.springframework.data.rest.core.annotation.RepositoryRestResource; @RepositoryRestResource(excerptProjection = UserBasicProjection.class) public interface UserRepository extends CrudRepository<User, Long> { }
这样Spring Data REST返回的响应就只会包含Projection中定义的字段,不会有_links。
内容的提问来源于stack exchange,提问作者Suraj Bande
相关产品推荐
相关产品推荐

