【问题标题】: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分享

    【讨论】:

      猜你喜欢
      • 2014-07-23
      • 2015-11-29
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 2019-09-30
      相关资源
      最近更新 更多