springspring-bootspring-hateoas

How to make HATEOAS render empty embedded array


Usually CollectionModel will return an _embedded array, but in this example:

@GetMapping("/{id}/productMaterials")
    public ResponseEntity<?> getProductMaterials(@PathVariable Integer id) {
        Optional<Material> optionalMaterial = materialRepository.findById(id);
        if (optionalMaterial.isPresent()) {
            List<ProductMaterial> productMaterials = optionalMaterial.get().getProductMaterials();
            CollectionModel<ProductMaterialModel> productMaterialModels =
                    new ProductMaterialModelAssembler(ProductMaterialController.class, ProductMaterialModel.class).
                            toCollectionModel(productMaterials);
            return ResponseEntity.ok().body(productMaterialModels);
        }
        return ResponseEntity.badRequest().body("no such material");
    }

if the productMaterials is empty CollectionModel will not render the _embedded array which will break the client. Is there any ways to fix this?


Solution

  • if (optionalMaterial.isPresent()) {
            List<ProductMaterial> productMaterials = optionalMaterial.get().getProductMaterials();
            CollectionModel<ProductMaterialModel> productMaterialModels =
                    new ProductMaterialModelAssembler(ProductMaterialController.class, ProductMaterialModel.class).
                            toCollectionModel(productMaterials);
            if(productMaterialModels.isEmpty()) {
                EmbeddedWrappers wrappers = new EmbeddedWrappers(false);
                EmbeddedWrapper wrapper = wrappers.emptyCollectionOf(ProductMaterialModel.class);
                Resources<Object> resources = new Resources<>(Arrays.asList(wrapper));
                return ResponseEntity.ok(new Resources<>(resources));
            } else {
                return ResponseEntity.ok().body(productMaterialModels);
            }
        }