当前位置: 代码迷 >> java >> Java REST端点可返回任何数据库列
  详细解决方案

Java REST端点可返回任何数据库列

热度:109   发布时间:2023-07-17 20:45:30.0

可以说我有一个名为Employee的postgres表,其中包含以下各列:

  • ID
  • 名字
  • 就业机会
  • 日期
  • 经理

我对拥有一个REST端点感兴趣,这样/employee/{ID}将以JSON格式返回该特定员工的所有信息,但是如果我指定/employee/{ID}/FirstName那么它将仅返回特定员工的名字/employee/{ID}/LastName以JSON格式返回时,将以JSON格式返回员工的姓氏,依此类推。 有什么好方法可以实现此目的,而不是实现用于访问每一列的端点? 谢谢。

解决此问题的一种简单方法是使用请求参数,而不是查询URL。 使用像fields这样的参数,您将拥有/employee/{id}?fields=FirstName,LastName这样的URL。 使用下面的代码,您将拥有一个Map<String, Object> ,该Map<String, Object>将与您的数据一起序列化为JSON。 像这样:

@ResponseBody
public Map<String, Object> getPerson(@PathVariable("id") long id, @RequestParam("fields") String fields) throws Exception {
    return personService.getPersonFields(id, fields);
}

@Service
class PersonService {

    public Map<String, Object> getPersonFields(Long personId, String fields) throws Exception {
        final Person person = personRepository.findById(personId);
        if (person == null) {
            throw new Exception("Person does not exists!");
        }

        String[] fieldsArray = fields.split(",");
        Map<String, Field> personFields = Arrays.stream(person.getClass().getFields()).collect(Collectors.toMap(Field::getName, field -> field);

        Map<String, Object> personFieldsReturn = new HashMap<>();
        for (String field : fieldsArray) {
            if (personFields.containsKey(field)) {
                personFields.get(field).setAccessible(true);
                personFieldsReturn.put(field, personFields.get(field).get(person));
                personFields.get(field).setAccessible(false);
            }
        }

        return personFieldsReturn;
    }

}

但是,这不是一个好的解决方案。 但它应该起作用。

因此,正如@dave在评论中提到的那样,您可以拥有一个REST端点/employee/{ID}/{column}并且在您的控制器中,您将有一个{column}参数值与数据库中实际列名之间的映射。 如果您不想在映射更改时重新部署应用程序,则可以将其放在jar / war之外的服务器上的单独属性文件中,还可以添加其他终结点,以重新加载服务器上的映射表单文件或终结点这样就可以上传和解析直接映射到您的应用程序的文件。

我建议您使用Spring Data RepositoryRestResource

首先,创建您的实体:

public class Employee {
    //props
}

之后,创建Employee Repository

@RepositoryRestResource(collectionResourceRel = "employee", path = "employee")
public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Long> {

    List<Employee> findByLastName(@Param("firstName") String firstName);

}

仅此而已,您将获得:

  • 使用HAL作为媒体类型的域模型的可发现REST API。
  • 代表您的模式的集合,项目和关联资源。
  • 分页和分类

等等。

查看文档:

  相关解决方案