我正在使用 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/