Конечная точка Java REST для возврата любых столбцов базы данных - PullRequest
0 голосов
/ 25 февраля 2019

Допустим, у меня есть таблица postgres с именем Employee со следующими столбцами:

  • ID
  • FirstName
  • LastName
  • Employment
  • Дата
  • Менеджер
  • Отдел

Я заинтересован в том, чтобы конечная точка REST была такой, чтобы /employee/{ID} возвращал всю информацию для этого конкретного сотрудника вВ формате JSON, но если я укажу /employee/{ID}/FirstName, тогда будет возвращено имя конкретного сотрудника только в формате JSON, /employee/{ID}/LastName вернет фамилию сотрудника в формате JSON и т. Д.Есть ли хороший способ реализовать это вместо реализации конечной точки для доступа к каждому столбцу?Спасибо.

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Таким образом, как @dave упоминается в комментарии, вы можете иметь конечную точку REST /employee/{ID}/{column}, и в вашем контроллере у вас будет соответствие между значением аргумента {column} и фактическим именем столбца в базе данных.Если вы не хотите повторно развертывать свое приложение при отображении изменений, вы можете поместить его в отдельный файл свойств на сервере за пределами вашего jar / war, а также можете добавить дополнительную конечную точку для перезагрузки файла формы отображения на сервере или конечной точки.это позволит загружать и анализировать файл с отображением непосредственно в ваше приложение.

0 голосов
/ 25 февраля 2019

Я бы предложил вам использовать RepositoryRestResource из Spring Data.

Прежде всего, создайте свою сущность:

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);

}

И это все, вы получите:

  • обнаруживаемый REST API для вашей доменной модели с использованием HAL в качестве типа носителя.
  • ресурсы коллекции, элементов и ассоциаций, представляющие ваш режим.
  • разбиение на страницы и сортировка

и т. Д.

Ознакомьтесь с документами:

Руководство по пружине

Пружина Dc

Проект данных по пружине

0 голосов
/ 25 февраля 2019

Простой способ решить эту проблему - использовать параметр запроса вместо запроса URL-адреса.Используя параметр типа fields, вы получите URL-адрес типа /employee/{id}?fields=FirstName,LastName.Используя приведенный ниже код, вы можете получить 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;
    }

}

Это не очень хорошее решение.Но это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...