Spring 获取实体的链接

标签 spring spring-boot spring-data spring-data-rest spring-hateoas

我正在使用 Spring-boot-starter-data-jpa,在我的 RestController 中我想返回新创建对象的位置。有没有一种方法可以反转 @RequestMapping 而不是硬编码如何构建 URL?

@RestController
@ExposesResourceFor(BookInstance.class)
public class BookInstanceController {
    @RequestMapping(value="/bookInstances", method=RequestMethod.POST)
    ResponseEntity<BookInstance> createBookInstance(@RequestBody BookInstance bookInstance){
    BookInstance createdBookInstance = bookInstanceRepository.save(bookInstance);

    return ResponseEntity.created(**reverseURL(createdBookInstance)**);
//      return new ResponseEntity<BookInstance>(createdBookInstance, HttpStatus.CREATED);
//      return createdBookInstance;
    }
}

我总是看到人们在这个函数中硬编码他们的 URL 构造,这让我无话可说......

当然我在同一个类中也有一个GET函数(否则就没有什么可以反转的了)

@RequestMapping(value="/bookInstances/{id}", method=RequestMethod.GET)
ResponseEntity<?> findOne(@PathVariable("id") Long id){
        BookInstance bookInstance = bookInstanceRepository.findOne(id);
        if(bookInstance == null){
            return ResponseEntity.notFound().build();
        }
        return new ResponseEntity<BookInstance>(bookInstance, HttpStatus.OK);
    }

最佳答案

我通过将它添加到我的类中解决了这个问题:

@Autowired EntityLinks entityLinks;

并使用 Spring 的一些 HATEOAS 功能。

Link link = entityLinks.linkToSingleResource(BookInstance.class, createdBookInstance.getId()).expand();
return ResponseEntity.created(URI.create(link.getHref())).build();

注意:在上面几行中,createdBookInstance 只是在数据库中创建记录后返回对象。

关于Spring 获取实体的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41955625/

相关文章:

spring - 如何使用 Spring Data JPA + Spring Web MVC 避免 JSON 序列化中的延迟获取?

java - 自动获取SQL查询中要使用的列(Hibernate/Mybatis/自制)? - 创建图书馆的想法

spring - 在 keycloak 和 spring rest api 中管理用户权限

java - 在 Java 中禁用 Outlook 电子邮件转发

java - 多个环境的单独属性文件

java - 如何强制hibernate不更新具有相同id的所有实体?

java - 如何将 JSON 数组反序列化为列表?

spring - 翻译约束检查 spring jpa 中的任一列不为空

jquery - 泽西 REST + CORS + Jquery AJAX 调用

java - Spring Boot 不会在 Postgres 中创建表