具有HATEOAS支持的自定义弹簧数据静止控制器

时间:2018-05-06 14:50:25

标签: java spring-data-rest spring-hateoas

我正在我的一个项目中实现Spring Data REST。我必须编写一些自定义存储库才能编写自定义查询。我在REST存储库前使用Controller。为了获得HATEOAS响应,我在我的控制器中使用PersistentEntityResourceAssembler。这个控制器适用于单个实体,但是如果是列表,我会得到一个异常" PersistentEntity不能为空!"

@RequestMapping(value="/employmentType", method=RequestMethod.GET, produces="application/hal+json")
    @ResponseBody
    public ResponseEntity<?> getEmploymentTypes(HttpServletRequest request, HttpServletResponse response,PersistentEntityResourceAssembler resourceAssembler) throws TenantUnavailableException, TenantInvalidException
    {
        try
        {
            List<EmploymentType> employmentTypeList = employmentTypeRepository.findAll();
            if(null==employmentTypeList || employmentTypeList.size()==0)
                return new ResponseEntity<ApiResponse>(new ApiResponse(false, ENTITY_NOT_FOUND),
                        HttpStatus.NOT_FOUND);
            // Accessing the 0th index works fine
            //In case of a full list, it throws "Persistant Entity must not be null !" exception
            return ResponseEntity.ok(resourceAssembler.toResource(employmentTypeList.get(0)));
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return new ResponseEntity<ApiResponse>(new AppResponse(false, REQUEST_NOT_PROCESSED),
                    HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

我正在努力利用最大的弹簧功能,而我的最终编码支持最少。我不想为项目中的每个持久实体编写ResourceAssembler。

如果有人有任何想法,请建议。

1 个答案:

答案 0 :(得分:1)

使用&#39;资源列表&#39;你可以使用类Resources,例如:

List<EmploymentType> types = employmentTypeRepository.findAll();
Resources<Resource<EmploymentType>> resources = Resources.wrap(types);
resources.add(/* you can add some links here */);
return ResponseEntity.ok(resources);

来自Resources javadoc:

  

一般帮助器,可以轻松地为实体集合创建包装器。