【问题标题】:Spring Data Rest: Generate Resource from Entity ModelSpring Data Rest:从实体模型生成资源
【发布时间】:2020-07-06 20:15:29
【问题描述】:
我正在寻找一种从给定 JPA 实体生成 hateoas 资源的方法,就像我这样指定 JPA 存储库时自动完成的方法一样:
public interface MyEntityRepo extends CrudRepository<MyEntity, Long> {
}
当我通过 REST 调用此端点时,我得到一个对象表示,包括实体链接。现在我想在不必调用我的“自己的”REST 端点的情况下获得该资源对象。
你有什么想法吗?
【问题讨论】:
标签:
spring-data-rest
spring-hateoas
【解决方案1】:
要包含self 链接和其他导航链接,例如first、next 和last,请实现RepresentationModelAssembler。
@Component
public class InventoryModelAssembler implements RepresentationModelAssembler<Inventory, EntityModel<Inventory>> {
@Override
public EntityModel<Inventory> toModel(Inventory inventory) {
return EntityModel.of(inventory,
linkTo(methodOn(InventoryController.class).get(inventory.getId()))
.withSelfRel());
}
}
在 Controller 中使用它来将您的实体转换为 EntityModel。第一个端点返回一个资源,第二个端点返回一个资源页面。
@RestController
@RequestMapping("/inventories")
@RequiredArgsConstructor
public class InventoryController {
private final InventoryRepository inventoryRepository;
private final PagedResourcesAssembler pagedResourcesAssembler;
private final InventoryModelAssembler inventoryModelAssembler;
@GetMapping("/{id}")
public ResponseEntity get(@PathVariable("id") String id) {
Optional<Inventory> inventory = inventoryRepository.findById(id);
return inventory.isPresent() ?
ResponseEntity
.ok()
.contentType(MediaTypes.HAL_JSON)
.body(inventoryModelAssembler.toModel(inventory.get())) :
ResponseEntity.notFound().build();
}
@GetMapping
public ResponseEntity get(@QuerydslPredicate(root = Inventory.class) Predicate predicate,
Pageable pageable) {
Page<Inventory> inventories = inventoryRepository.findAll(predicate, pageable);
return ResponseEntity
.ok()
.contentType(MediaTypes.HAL_JSON)
.body(pagedResourcesAssembler.toModel(inventories, inventoryModelAssembler));
}
}
完整项目在Github分享